春のカフカの消費が異常です:グループがすでにバランスを取り直しているため、コミットを完了できません消費者が突然ライブを停止し、消費を停止します

ある日、オンライン環境で多数のKafka例外が報告されました:CommitFailedException

org.apache.kafka.clients.consumer.CommitFailedException:
 Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member.
 This means that the time between subsequent calls to poll() was longer than the configured max.poll.interval.ms,
 which typically implies that the poll loop is spending too much time message processing.
 You can address this either by increasing the session timeout or by reducing the maximum size of batches returned in poll() with max.poll.records.

後の分析で、1回のポーリングプル(デフォルトは500)メッセージ後の処理時間が長すぎたために例外が発生し、2つのプル間の時間間隔がmax.poll.interval.msしきい値(デフォルトは5分)を超えたことが明らかになりました。 )。ソリューション戦略では、パラメーターmax.poll.interval.msを増やすか、一度にプルされるメッセージの数を減らすことができます。私はそれを解決するためにプルメッセージとsession.timeout.msの数を変更するためにここにいます。
ばねの構成は次のとおりです。

spring:
  kafka:
   consumer:
     max-poll-records: 200

また、spring.kafka.properties.session.timeout.msを変更しました

spring:
  kafka:
   properties:
    session:
      timeout:
        ms: 120000

0.10.0.0以降のバージョンはmax.poll.interval.msパラメーターによって決定されているため、これを変更する必要がない場合があります。


事例2:
さらに、最近インターネットに別の異常が現れました。
ニュースが蓄積され、消費されておらず、消費者が亡くなったように感じます。サービスの再起動後、消費は開始されますが、
消費は一定期間停止します。
コンシューマー数とポッド(ノード)数を増やしてみましたが、完全に解決できず、例外が残っていました。
スタック情報をダンプすることにより、消費がすべてWAITING状態にあり、この状態が一時停止状態であり、無期限に待機していることがわかります。

"kafka-coordinator-heartbeat-thread | CID_alikafka_xxx" #125 daemon prio=5 os_prio=0 tid=0x00007f1aa57fa000 nid=0x86 in Object.wait() [0x00007f1a8af80000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:502)
        at org.apache.kafka.clients.consumer.internals.AbstractCoordinator$HeartbeatThread.run(AbstractCoordinator.java:920)
        - locked <0x00000000e798f558> (a org.apache.kafka.clients.consumer.internals.ConsumerCoordinator)

   Locked ownable synchronizers:
        - None

"kafka-coordinator-heartbeat-thread | CID_alikafka_xxx" #124 daemon prio=5 os_prio=0 tid=0x00007f1aa546b800 nid=0x85 in Object.wait() [0x00007f1a8b081000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:502)
        at org.apache.kafka.clients.consumer.internals.AbstractCoordinator$HeartbeatThread.run(AbstractCoordinator.java:920)
        - locked <0x00000000e798f888> (a org.apache.kafka.clients.consumer.internals.ConsumerCoordinator)

   Locked ownable synchronizers:
        - None

その後、公式文書を確認したところ、
https
ここに画像の説明を挿入
//docs.spring.io/spring-kafka/docs/2.6.3-SNAPSHOT/reference/html/ max.pollを超えたため、消費者が停止されました。 interval .msのデフォルトは5分です。実際、メッセージの受信後のビジネス処理が遅すぎることが原因であり、この部分は後で最適化されます。
その後、spring.kafka.properties.max.poll.interval.msを600,000(10分)に増やします。

春のカフカのいくつかのパラメータの紹介

spring.kafka.producer.batch-size 150  一次性拉取消息数

spring.kafka.properties.max.poll.interval.ms  两次poll的间隔默认5分钟

spring.kafka.producer.batch-size  一次性提交大小(默认16384字节)针对消息生产者

spring.kafka.listener.concurrency  消费者数量,平均分配kafka的partition,如24个partition,此值为8,则每个消费者负责3个partition。

おすすめ

転載: blog.csdn.net/huangdi1309/article/details/109447899