Kafka无法发送消息到broker的细节解读

Kafka的java API模拟生产者发消息(带回调)。执行下面的函数控制台会立刻结束返回,但是并不会打印出回调函数返回的内容,而且消费者也无法消费到数据。

public class NewProducerCallback {
    public static void main(String[] args) throws InterruptedException {
        Properties props = new Properties();
        // Kafka服务端的主机名和端口号
        props.put("bootstrap.servers", "s00:9092");
        // 等待所有副本节点的应答
        props.put("acks", "all");
        // 消息发送最大尝试次数
        props.put("retries", 0);
        // 一批消息处理大小
        props.put("batch.size", 16384);
        // 增加服务端请求延时
        props.put("linger.ms", 1);
        // 发送缓存区内存大小
        props.put("buffer.memory", 33554432);
        // key序列化
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        // value序列化
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(props);
 
        for (int i = 0; i < 5; i++) {
            // 为什么回调这部分不能打印出来?在调试的时候,稍等一会才可以? 这是因为后面没有加上 producer.close() 导致程序执行完了,但是客户端不确定是否要发到broker上去
            kafkaProducer.send(new ProducerRecord<String, String>("test", "hello back2 - " + i), new Callback() {
 
                @Override
                public void onCompletion(RecordMetadata metadata, Exception exception) {
                    System.out.println(metadata.partition() + "---" + metadata.offset());
 
                    if (exception == null) {
                        System.out.println(metadata.partition() + "---" + metadata.offset());
                    }
                }
            });
        }
 
    }
}
过一段时间后,在消费者会出现一个警告,如下: 

[2019-04-06 10:16:07,238] WARN Client session timed out, have not heard from server in 4003ms for sessionid 0x169d74bbb41002e (org.apache.zookeeper.ClientCnxn)
说明其实Kafka还是在维护这个生产者,但是实际上生产者已经退出了。所以有警告。

【解决方法】让生产者常驻后台或者正常关闭生产者

//方法1
Thread.sleep(1000); // 休眠(模拟生产常驻进程)
// 方法2
kafkaProducer.close(); // 关闭生产者,让程序立刻推数据到broker
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用PHP rdkafkaKafka broker消费消息,你可以按照以下步骤进行操作: 1. 确保已经在服务器上正确安装了Kafka和rdkafka扩展。可以参考官方文档或者其他资源进行安装和配置。 2. 创建一个消费者实例并设置相关的配置参数。例如: ```php $conf = new RdKafka\Conf(); $conf->set('group.id', 'your_consumer_group_id'); $conf->set('metadata.broker.list', 'your_broker_host:your_broker_port'); $consumer = new RdKafka\KafkaConsumer($conf); ``` 在上面的代码中,你需要设置`group.id`为你的消费者组ID,`metadata.broker.list`为你的Kafka broker地址。 3. 订阅一个或多个主题来消费消息。例如: ```php $consumer->subscribe(['topic1', 'topic2']); ``` 在上面的代码中,你可以将要消费的主题名称以数组的形式传递给`subscribe`方法。 4. 使用`consume`方法从Kafka broker获取消息。例如: ```php while (true) { $message = $consumer->consume(120 * 1000); // 设置超时时间 switch ($message->err) { case RD_KAFKA_RESP_ERR_NO_ERROR: // 处理消息 echo 'Key: ' . $message->key . ', Value: ' . $message->payload . PHP_EOL; break; case RD_KAFKA_RESP_ERR__PARTITION_EOF: // 没有更多消息,等待新消息到达 break; case RD_KAFKA_RESP_ERR__TIMED_OUT: // 超时,继续下一次消费 break; default: // 错误处理 echo 'Error: ' . $message->errstr() . PHP_EOL; break; } } ``` 在上面的代码中,`consume`方法将会阻塞等待消息的到达,并返回一个`RdKafka\Message`对象。你可以根据返回的消息对象做相应的处理,比如获取消息的键和值。 请注意,上述代码仅为示例,你需要根据实际情况进行适当的修改和错误处理。 希望以上信息对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值