记一次kafak异步发送变同步阻塞的问题

9 篇文章 0 订阅
1 篇文章 0 订阅
本文探讨了在使用KafkaTemplate.send()发送消息时遇到的阻塞问题。通常,该方法是异步的,但在网络问题导致首次获取Metadata失败时,会导致阻塞。当KafkaProducer尝试更新Metadata时,主线程会等待更新完成,从而引发阻塞。为了解决这个问题,确保网络连接稳定,并正确处理 Metadata 获取失败的情况,可以在回调函数中进行错误处理,确保系统的健壮性。
摘要由CSDN通过智能技术生成

在发送kafak 消息时,用的kafkaTemplate.send(), 返回的是个Future对象,没有get()去阻塞,发送方法是异步的。但是有次在切内网测试时发现这个方法被阻塞了。经过不断调试,发现当第一次启动发送消息时,如果有网络问题,获取卡夫卡服务器不可达,会造成阻塞。
经查阅文档,

发现第一次发送消息时生产者回请求kafak服务端,获取该主题的元数据 Metadata,Metadata 内容包括了主题相关分区 Leader 所在节点信息、副本所在节点信息、ISR 列表等,Kafka Producer 获取 Metadata 后,便会根据 Metadata 内容将消息发送到指定的分区 Leader,Kafka Producer 在发送消息之前,会检查主题的 Metadata 是否需要更新,如果需要更新,则会唤醒 Sender 线程并发送 Metatadata 更新请求,此时 Kafka Producer 主线程则会阻塞等待 Metadata 的更新。

我当时没有正确的切换网络导致第一次请求不到Metatadata ,从而导致阻塞的。

 ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topic,obj2String);
        future.addCallback(new ListenableFutureCallback<SendResult<String, Object>>() {
            @Override
            public void onFailure(Throwable throwable) {

                //发送失败的处理
            
            }

            @Override
            public void onSuccess(SendResult<String, Object> stringObjectSendResult) {
                //成功的处理
             
            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值