多线程 Kafka 生产者如何工作?

How multi-threaded Kafka producer work?

当只有一个流数据源时,多线程 Kafka Producer 将如何工作?假设我们有三个生产者线程。每个生产者如何知道数据消费将从哪里开始?我们不希望每个生产者都使用相同的数据(重复)。

在我看来,这不是 Kafka 的问题,而是在使用生产者向 Kafka 发送消息之前如何同步客户端(作为 API 的接收者)。

How multi threaded Kafka Producer will work when u have single source of streaming data?

您可能希望使用某种中间状态来跟踪成功存储在 kafkastream 中的事件的主键。

将其想象成关系数据库,当您尝试使用相同的主键写入多个记录时,数据库会抛出 DuplicateKeyException

与 kafka 流相同,在您的事件中选择一些独特的属性作为主键,并将它们存储在某种缓存中(如果所有生产者都在同一个 machine/same 应用程序中,则简单地使用 hashmap,但分布式缓存如Redis、Memcached(如果你的生产者分布在不同的机器上)

因此,如果事件在缓存中已处于 EMITTED 状态,则流程将删除该事件。

                               | emitted events |
Producer1---event1, event10 ---| e1  - EMITTED  |  
                               | e10 - EMITTED  |   eventstream
                               |                |--------------------
Producer2---event1, event2-----| e2 - EMITTED   |  e1, e10, e2, e3  
   (ignores e1)                |                |
                               |                |--------------------
Producer3---event1, event3-----| e3 - EMITTED   |
   (ignores e1)                |                |

一旦 kafkastream 确认持久性,您可能还想跟踪事件的两种状态,EMIT_INITIATEDEMITTED。这将解决当生产者 1 和生产者 2 都尝试同时发出 event1 并且由于其中 none 在缓存中看到它,它们都将被发射到流中的问题。