簡體   English   中英

發送到Kafka REST-Proxy的郵件被“此服務器不是該主題分區的領導者”錯誤拒絕

[英]Messages sent to Kafka REST-Proxy being rejected by “This server is not the leader for that topic-partition” error

對於來自融合平台的Kafka rest-proxy,我們的開發團隊和環境支持團隊之間一直遇到一些麻煩和不同的理解。

首先,我們有5個Kafka代理的環境,具有64個分區3的復制因子

碰巧,我們對rest-proxy的調用現在都使用以下結構:

curl -X POST \
  http://somehost:8082/topics/test \
  -H 'content-type: application/vnd.kafka.avro.v1+json' \
  -d '{  
   "value_schema_id":1,   
   "records":[  
      { "foo":"bar" }]}'

這種呼叫對98.4%的呼叫有效,我注意到當我嘗試進行2k次以上的呼叫時,我們沒有收到來自分區62的任何OK響應(恰好是分區的1.6% )。 在支持團隊回收架構注冊表之前,當我們有7個分區返回錯誤時,該錯誤率曾經是10.9%

現在,當呼叫轉到分區62時,我們收到以下答復:

{
    "offsets": [
        {
            "partition": null,
            "offset": null,
            "error_code": 50003,
            "error": "This server is not the leader for that topic-partition."
        }
    ],
    "key_schema_id": null,
    "value_schema_id": 1
}

當我嘗試將消息發送到在URL上添加“ / partitions / 62”的特定分區時,該錯誤相同。

支持人員說rest-proxy不夠聰明(他們說, “這只是一個代理” )以選擇一個有效的分區並將其發布到該分區的領導經紀人。 他們說,它隨機選擇分區,然后隨機選擇要發布的代理(這可能導致它發布到副本或什至沒有分區的代理)。 他們建議我們在發布消息之前更改呼叫以獲取主題元數據,然后通知分區和代理並在應用程序端處理循環分配,這對我來說沒有意義。

在開發方面,我的理解是rest-proxy使用apache kafka-client將消息發布到代理,因此足夠聰明,可以將領導者代理發布到給定的分區,並且它還處理不通知分區時的kafka-client lib。 在我看來,這似乎是與該分區有關的環境問題,而不是與呼叫應用程序本身有關的問題(因為在具有相同配置的其他環境中,它可以正常工作)。

綜上所述,我的問題是:

  1. 當我說rest-proxy足夠聰明來處理分區循環並發布給領導者時,我是否正確?
  2. 應用程序應該處理問題1的邏輯嗎? (在這種情況下,我看不出直接使用rest-proxy而不是kafka-client的原因)
  3. 對您來說,這在環境業務流程中是否也存在問題?

希望您能給我一些幫助很清楚!

提前致謝!

我不使用rest-proxy,但是此錯誤可能表明在調用期間發生NotLeaderForPartitionException 此錯誤表明分區的領導者已更改,但生產者仍使用陳舊的元數據。 當代理之間的復制由於Kafka服務器內部錯誤而失敗時,發生了此錯誤。 可以在服務器日志中檢查。

在我們的案例中,我使用./kafka-topics.sh --describe --zookeeper zookeeper_ip:2181 --topic test檢查了該主題,它顯示來自代理的一個副本沒有同步(ISR列)。 重新啟動該代理程序的幫助,副本變得同步,錯誤消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM