为什么我的Apache Kafka使用者随机忽略排队的消息?

时间:2019-02-07 10:58:36

标签: python apache-kafka pykafka faust

这可能是一个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)

我的假设是,我使用消息的方式存在一些问题,或者使用者组偏移量的状态不一致,但是我无法真正解决这个问题。

我也正在考虑转移到浮士德来解决问题。考虑到我的代码库和我的体系结构决定,过渡应该不会太难,但是在开始这项工作之前,我想确保我朝着正确的方向前进。现在,只是盲目地希望造成问题的某些细节消失了。

0 个答案:

没有答案