昨天在做方案调研,用python-kafka往 Kafka 里塞数据时发现了个很奇怪的问题:有的请求会阻塞60s后报错。
但我们都知道python-kafka是可以完全异步的,他自己用local-thread实现了异步的发送功能。并且看官方Producer API返回的是一个Future,理应不会卡住,但Block却实实在在的发生了,让人很费解。
排查问题
胡乱百度
因为我们用的是gunicorn + gevent,百度了一圈,发现了如下问题:
gevent 的 mock 导致pykafka thread staving
https://github.com/dpkp/kafka-python/issues/1867
但这个issue提到该问题已经在1.4.7解决了,我用的是2.0.1,理应没这问题。
还记得看到了个
uwsgi使用fork的方式来实现多进程
想了想,如果Producer在fork之前被创建会出现线程本身无法被复制的情况,也是有这可能的。
本着死马当活马医的态度,挨个解决这俩问题:
- gevent 改为 gthread
- 在接口第一次调用的时候再生成Producer
结果还是一样,仍会有Blocking,并且还是60秒
认真分析
胡乱百度果然靠不住,解决问题还是得一点一点来。
首先认真看