大型 Kafka 消息与小型消息 + DB

Large Kafka messages vs small messages + DB

在设计使用 Kafka 来处理 separate/parallelise 个工作单元的系统时,我发现我有 2 个选择:

Data -> manipulate data -> store in DB -> send ID as message -> load data from DB using ID in message ->...

Data -> manipulate data -> send data as message -> load data from message ->...

第二个选项摆脱了在数据库中保存和加载数据的所有副作用代码,如果我这样做,那么我的代码会好得多,我的单元有时可以变成一个纯函数。我也减少了数据库的负载。缺点是此消息可能很大,而消息传递系统通常设计为处理小消息时速度很快。

我的问题是:

  1. 在什么时候(多少字节)一条消息对于 Kafka 来说开始显得有点大?
  2. 还有哪些优点和缺点需要考虑?

kafka 代理配置中的 message.max.bytes 属性 定义了服务器可以接收的最大消息大小。默认值为 1000000 文档说

The maximum size of a message that the server can receive. It is important that this property be in sync with the maximum fetch size your consumers use or else an unruly producer will be able to publish messages too large for consumers to consume.

kafka的大消息没有问题。一个潜在的问题是代理和消费者必须解压缩消息并因此使用他们的 RAM。所以如果尺寸很大,它会给 RAM 带来压力(但我不确定多大尺寸可以给你可见的结果)。

Benchmarking page from LinkedIn消息大小的影响 有很好的解释。所以我就把它留在这里。


我主要展示了 100 字节的小消息的性能。较小的消息对于消息系统来说是更难的问题,因为它们会放大系统的簿记开销。当我们改变记录大小时,我们可以通过在 records/second 和 MB/second 中绘制吞吐量来显示这一点。

因此,正如我们所料,该图显示我们每秒可以发送的原始记录数随着记录变大而减少。但是如果我们查看 MB/second,我们会发现真实用户数据的总字节吞吐量随着消息变大而增加:

我们可以看到,对于 10 字节的消息,我们实际上 CPU 仅通过获取锁和排队发送消息来绑定——我们实际上无法最大化网络。然而,从 100 字节开始,我们实际上看到了网络饱和(尽管 MB/sec 继续增加,因为我们的 fixed-size 簿记字节在发送的总字节中所占的比例越来越小)。


基于此,我不会太担心您的消息的大小,而是继续使用您的第二个更简单的解决方案。