rdkafka-php producer 异步等待程序不退出

最近想使用 kafka 做消息队列,但是在使用producer的时候,发现程序总是要等待一两秒才退出。
代码如下:

<?php

$rk = new RdKafka\Producer();
$rk->setLogLevel(LOG_DEBUG);
$rk->addBrokers("127.0.0.1");

$topic = $rk->newTopic("test");

for ($i = 0; $i < 10; $i++) {
    $topic->produce(RD_KAFKA_PARTITION_UA, 0, "Message $i");
    $rk->poll(0);
}

这是官方给出的例子,由于 produce 是异步的所以,程序在结束前 producer 会等待确认消息是否已经发送成功,但是等待的时间实在是太久了,有一两秒,如何配置才能使其不用异步去处理。

在java的api中看到有这样的配置

Properties props = new Properties();
props.put('producer.type', 'sync');

这样producer 就不会异步去处理了, 但是我在rdkafka-php的文档中没有看到这样的配置。
求大神给个建议,十分感谢。

阅读 10.2k
3 个回答

靠,我3个月前也遇到这个问题了。。。 本来以为问题不大,现在上了量了,直接把php-fpm给忙死了....

WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 14 idle, and 161 total children

兄弟你要是找到答案了记得回复我哈; 当然了我要是研究出答案也会告诉你的~

研究结果

问题的官方详细讨论在这里 https://github.com/arnaud-lb/...

这里还有包括这个扩展在内的其他方案的讨论, https://www.reddit.com/r/PHP/...

arnaud-lb 是这个扩展的作者,上面2个页面他都有发言

总之就是这个扩展存在2个主要问题,

1是没有persistent connections 这个没法解决

2 是会拖慢php-fpm速度,直接慢1s; 作者给的解决方案我捣鼓2天基本确定都搞不定或者代价太大。。。

结果就是导致php-fpm worker不够用,忙。。。继而就是机器负载开始飚。。。

我们最后是用java 写个 proxy 来写kafak 的

新手上路,请多包涵

我想知道答案,找到解决方案了吗? 兄弟

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏