【问题标题】:Kafka Producer (with multiple instance) writing to same topicKafka Producer(具有多个实例)写入同一主题
【发布时间】:2020-01-10 00:39:07
【问题描述】:

我有一个用例,其中消息来自一个通道,我们希望将其推送到 Kafka 主题(多个分区)中。在我们的案例中,消息顺序很重要,因此我们必须按照接收消息的顺序将消息推送到主题,如果我们只有一个 producer 和单个分区,这看起来非常简单。在我们的例子中,为了负载平衡和可扩展性,我们希望为同一个producer 运行多个实例,但问题是如何维护消息的顺序

任何想法或解决方案都会很有帮助。

即使我认为只有一个分区,它是否可以复制到多个代理以实现可用性和容错?

【问题讨论】:

  • 是的,您可以使用单个分区复制主题。为了保持消息的顺序(如果有多个分区),您必须找到可用于对消息进行分组的东西。

标签: apache-kafka kafka-producer-api


【解决方案1】:

我们必须按照收到的顺序将消息推送到主题 如果我们只有一个生产者并且 单分区

如果您为消息提供密钥,您可以在主题中拥有多个分区和一个生产者,并且仍然保持顺序。由单个生产者生成的具有相同密钥的所有消息始终是有序的。


当您说多个生产者时,我假设您正在运行应用程序的多个实例,并且您没有在同一个 JVM 实例中创建多个生产者。

既然你说channel,我假设它是一个像Datagram channel这样的网络通道,例如。在这种情况下,我假设您正在侦听某个端口并将接收到的数据发送到 Kafka。

我认为在同一个实例中有多个生产者没有意义 生产相同的主题,所以最好有一个生产者 发送所有消息,为了性能,您可以调整生产者 batch.sizelinger.ms 等属性。

为了实现容错,让另一个实例以 HA 模式(故障转移模式)运行,这样如果这个实例死了,另一个实例会自动恢复。

如果是网络通道,可以运行多个实例并打开 带有选项 SO_REUSEADDR 的套接字 StandardSocketOptions 这样你就只有一个制作人了 在任何时候都处于活动状态,并且新的生产者将在 活跃的人死了。

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多