这可能是一个eisenbug,所以我不希望得到确切的答案,而是更多有关寻找可复制该bug的提示。
我有一个由事件驱动的,基于kafka的系统,由若干服务组成。目前,它们以线性管道组织。一种主题,一种事件类型。每个服务都可以看作是从一种事件类型到一种或多种事件类型的转换。
每个转换都是由python进程执行的,它具有自己的使用者和生产者。它们都共享相同的代码和配置,因为它们都是从服务实现中抽象出来的。
现在,这是什么问题。在我们的暂存环境中,有时(假设每50条消息中有一条),Kafka上有一条消息,但消费者根本没有处理它。即使您等待几个小时,它也会挂起。在本地环境中不会发生这种情况,而且我们无法在其他任何地方复制它。
更多相关信息:
我的消费方式
我使用pykafka,这是使用者循环:
def create_consumer(self):
consumer = self.client.topics[bytes(self.input_topic, "UTF-8")].get_simple_consumer(
consumer_group=bytes(self.consumer_group, "UTF-8"),
auto_commit_enable=True,
offsets_commit_max_retries=self.service_config.kafka_offsets_commit_max_retries,
)
return consumer
def run(self):
consumer = self.create_consumer()
while not self.stop_event.wait(1):
message = consumer.consume()
results = self._process_message(message)
self.output_results(results)
我的假设是,我使用消息的方式存在一些问题,或者使用者组偏移量的状态不一致,但是我无法真正解决这个问题。
我也正在考虑转移到浮士德来解决问题。考虑到我的代码库和我的体系结构决定,过渡应该不会太难,但是在开始这项工作之前,我想确保我朝着正确的方向前进。现在,只是盲目地希望造成问题的某些细节消失了。