Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的apache kafka消费者会随机忽略排队的消息?_Python_Apache Kafka_Pykafka_Faust - Fatal编程技术网

Python 为什么我的apache kafka消费者会随机忽略排队的消息?

Python 为什么我的apache kafka消费者会随机忽略排队的消息?,python,apache-kafka,pykafka,faust,Python,Apache Kafka,Pykafka,Faust,这可能是一个eisenbug,所以我不希望有硬性的答案,但希望有更多的提示,说明需要寻找什么才能复制这个bug 我有一个事件驱动的、基于卡夫卡的系统,它由几个服务组成。目前,它们被组织在线性管道中。一个主题,一个事件类型。每个服务都可以看作是从一个事件类型到一个或多个事件类型的转换 每个转换都作为一个python进程执行,有自己的使用者和生产者。它们都共享相同的代码和配置,因为这些都是从服务实现中抽象出来的 现在,有什么问题吗。在我们的登台环境中,有时(比方说每50条消息中就有一条消息),卡夫卡

这可能是一个eisenbug,所以我不希望有硬性的答案,但希望有更多的提示,说明需要寻找什么才能复制这个bug

我有一个事件驱动的、基于卡夫卡的系统,它由几个服务组成。目前,它们被组织在线性管道中。一个主题,一个事件类型。每个服务都可以看作是从一个事件类型到一个或多个事件类型的转换

每个转换都作为一个python进程执行,有自己的使用者和生产者。它们都共享相同的代码和配置,因为这些都是从服务实现中抽象出来的

现在,有什么问题吗。在我们的登台环境中,有时(比方说每50条消息中就有一条消息),卡夫卡上有一条消息,但消费者根本没有处理它。即使你等了几个小时,它也会挂起来。这种情况在本地环境中不会发生,我们也无法在其他任何地方复制这种情况

一些更相关的信息:

  • 这些服务经常被重新启动以进行调试,但挂起似乎与重新启动无关
  • 当消息挂起且您重新启动服务时,服务将处理该消息
  • 这些服务是完全无状态的,因此没有缓存或其他奇怪的东西(我希望如此)
  • 当这种情况发生时,我有证据表明他们仍然没有处理旧消息(当他们产生输出时我会记录,而这种情况正好发生在使用者循环结束之前)
  • 在当前部署中,消费者组中只有一个消费者,因此在相同的服务中没有并行处理,也没有服务的水平扩展
我如何消费:

我使用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)
我的假设是,要么我使用消息的方式存在一些问题,要么消费者组偏移量的状态不一致,但我无法真正将注意力集中在这个问题上


我也在考虑搬到浮士德去解决这个问题。考虑到我的代码库和架构决策,转换应该不会太难,但在开始这样的工作之前,我想确定我的方向是正确的。现在,这只是一个盲目的尝试,希望造成问题的某些细节会消失。

您启用了
auto\u commit\u=True
这将提交偏移量,无论消息是否正确处理。异常或错误将意味着事件无法到达目标。当然,这将被记录或使服务崩溃。问题是服务没有问题,日志很干净。在另一个地方,他们建议在self.output\u结果之后提交,我会这样做,因为这是一个很好的设计,而且我已经将此更改推迟了太长时间。您启用了
auto\u commit\u=True
这将提交偏移量,无论消息是否经过处理对。异常或错误将意味着事件无法到达目标。当然,这将被记录或使服务崩溃。问题是服务没有问题,日志也没有问题。在另一个地方,他们建议在self.output_结果之后提交,我会这样做,因为这是一个很好的设计,我已经推迟了太长时间。