Kafka - 确保至少有一个消费者会收到消息
Kafka - Ensuring that at least one consumer will receive the message
我正在构建一个分布式应用程序,我决定将 Kafka 引入其中。然而,我很难弄清楚一些事情。
我了解拥有消费者组可确保 HA 和高消息吞吐量。尽管组中的每个消费者 "following" 只是主题中的一个分区。比方说,我们有 1 个主题和 4 个分区,一个消费者组有 4 个消费者。如前所述,每个消费者只会从其指定的分区获取消息。
现在假设我们有一些生产者向主题发布消息。一个生产者将消息写入主题的分区 1,消费者 1 接收它并对其执行一些逻辑,因此它很忙。然后发布另一条消息,但发送到同一分区。 None 的其他消费者将能够收到它,因为分区不会 "belong" 给他们。
我正在寻找一种方法,无论何时产生一条新消息,即使它没有写入其分区,至少有一个空闲消费者会立即收到它。
据我所知,这在 Kafka 中是不可能的。正如您正确描述的那样,一组中最多只能有一个消费者读取一个分区。这样您就可以确保分区内消息的排序。
要防止应用程序在其中一个消费者死亡时变得更慢,您可以做的是拥有比分区更多的消费者。这样你就会有一些闲置的消费者,它们可以跟上实际消费消费者的状态,并在其中一个工作消费者死亡时迅速加入。
您也可以增加分区以避免其中一个分区负载过大。或者,作为替代方案,如果您提前知道您的数据,您可以在 Kafka 生产者中有一个自定义分区程序,它以一种处理可以均匀分布在分区及其消费者上的方式分发消息。
您可以对您的消费者使用 .assign()
方法而不是 .subscribe()
方法,这样他们就不会在任何消费者组中。但是,通过这种方式,他们将接收来自指定分区的所有消息。然后,您可能会在客户端实现一些逻辑,以防止处理由其他实例处理的消息,但无论如何,您最终都会失去顺序,而且很可能会失去交付保证。
我正在构建一个分布式应用程序,我决定将 Kafka 引入其中。然而,我很难弄清楚一些事情。
我了解拥有消费者组可确保 HA 和高消息吞吐量。尽管组中的每个消费者 "following" 只是主题中的一个分区。比方说,我们有 1 个主题和 4 个分区,一个消费者组有 4 个消费者。如前所述,每个消费者只会从其指定的分区获取消息。
现在假设我们有一些生产者向主题发布消息。一个生产者将消息写入主题的分区 1,消费者 1 接收它并对其执行一些逻辑,因此它很忙。然后发布另一条消息,但发送到同一分区。 None 的其他消费者将能够收到它,因为分区不会 "belong" 给他们。
我正在寻找一种方法,无论何时产生一条新消息,即使它没有写入其分区,至少有一个空闲消费者会立即收到它。
据我所知,这在 Kafka 中是不可能的。正如您正确描述的那样,一组中最多只能有一个消费者读取一个分区。这样您就可以确保分区内消息的排序。
要防止应用程序在其中一个消费者死亡时变得更慢,您可以做的是拥有比分区更多的消费者。这样你就会有一些闲置的消费者,它们可以跟上实际消费消费者的状态,并在其中一个工作消费者死亡时迅速加入。
您也可以增加分区以避免其中一个分区负载过大。或者,作为替代方案,如果您提前知道您的数据,您可以在 Kafka 生产者中有一个自定义分区程序,它以一种处理可以均匀分布在分区及其消费者上的方式分发消息。
您可以对您的消费者使用 .assign()
方法而不是 .subscribe()
方法,这样他们就不会在任何消费者组中。但是,通过这种方式,他们将接收来自指定分区的所有消息。然后,您可能会在客户端实现一些逻辑,以防止处理由其他实例处理的消息,但无论如何,您最终都会失去顺序,而且很可能会失去交付保证。