我正在使用kafka-node模块将消息发送到kafka。 在集群环境中,我的主题有3个分区,复制因子为3。
主题描述为-
Topic:clusterTopic PartitionCount:3 ReplicationFactor:3 Configs:min.insync.replicas=2,segment.bytes=1073741824
Topic: clusterTopic Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: clusterTopic Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 1,2,3
Topic: clusterTopic Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 1,2,3
生产者配置-
"requireAcks": 1,
"attributes": 2,
"partitionerType": 2,
"retries": 2
当我发送数据时,它像循环式一样遵循分区类型为cyclic(2)
当我按照以下步骤操作
我期望的是,如果无法访问分区(由于代理关闭),生产者应该自动将数据发送到下一个可用分区,但是由于异常,我丢失了消息
例外如下-
TimeoutError: Request timed out after 3000ms
at new TimeoutError (\package\node_modules\kafka-node\lib\errors\TimeoutError.js:6:9)
at Timeout.timeoutId._createTimeout [as _onTimeout] (\package\node_modules\kafka-node\lib\kafkaClient.js:980:14)
at ontimeout (timers.js:424:11)
at tryOnTimeout (timers.js:288:5)
at listOnTimeout (timers.js:251:5)
at Timer.processTimers (timers.js:211:10)
(node:56416) [DEP0079] DeprecationWarning: Custom inspection function on Objects via .inspect() is deprecated
kafka-node:KafkaClient kafka-node-client reconnecting to kafka1:9092 +3s
kafka-node:KafkaClient createBroker kafka1 9092 +1ms
kafka-node:KafkaClient kafka-node-client reconnecting to kafka1:9092 +3s
kafka-node:KafkaClient createBroker kafka1 9092 +0ms
答案 0 :(得分:0)
请发送引导服务器进行确认,但是根据您所掌握的信息,我相信您遇到的情况如下:
使用这些设置,生产者会将事件发送到领导者副本,并假定消息是安全的。
如果在发送后立即且在追随者赶上之前失败,则您将丢失消息,因为您仅在等待一个确认。
但是,从代理角度来看,您要指定主题可用的要求是2个同步副本。默认情况下,仅允许同步副本被选为领导者。由于第一个失败会导致关注者不同步,因此您的主题可能被迫离线。您可以在测试中验证这一点,它需要进行一些设置。
要进行纠正,请尝试以下操作:
您也可以将unclean.leader.election.enable设置为true以获得高可用性,因为这将允许不同步的副本被选为领导者,但是这样可能会丢失数据。