pykafka 调用栈

【背景】

使用pykafka向kafka管道中发送同步消息,但是总会出现message丢失导致的死循环。

client初始化是根据标记use_greenlets设置handler是否使用greenlets实现并行,默认使用ThreadingHandler。

在Producer的init函数里调用producer.start(),设置running状态, 创建OwnedBroker的连接。

OwnedBroker的init中调用start

在start中, 通过self.producer._cluster.handler.spawn()创建多个worker进行消息读取,函数为queue_reader;

queue_reader: broker通过flush不断从self.queue队列 pop出需要发送的消息.

得到单条消息后通过self.producer._send_request发送消息

producer.produce()

cluster 在_request_metadata 向borker发请求是创建Broker

Broker在connect时调用RequestHandler,启动handler线程

Producer _send_request函数从message_batch中得到msg, self._topic.name, msg.partition_id,加入到ProduceRequest对象中,这个request的发送消息的容器。

增加等待的msg条目数,然后增加的值是负数。。。所以是减少跟踪的在等待的msg条目数

err为0,表示没有错误,可以从pending的msg中删除跟踪状态了

后记

现在还没有找到原因,已经在git上跟作者提问题了。

你可能感兴趣的:(大数据,python)