最近想使用 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的文档中没有看到这样的配置。
求大神给个建议,十分感谢。
靠,我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 的