具有基于线程并行性的 Kafka Streams 与用于并行处理的 Kafka Parallel Consumers

问题描述 投票:0回答:1

我们正在为实时协作形式构建事件驱动的架构。我们的解决方案使用 Kafka 作为事件代理,其中事件排序和有状态流处理是关键要求。我们预计在任何给定时间大约有 5000 个活动表单,峰值负载约为每秒 10,000 个事件。

问题
表单中的字段是相互关联的,因此一个字段的更改可能会影响必须自动填充的其他字段。该应用程序处理小型和大型事件,每个事件都有不同的处理时间
示例
小事件(表单中的单个字段更改):大约需要 150 毫秒来处理
大型事件(使用 Excel 文件上传完整的表单数据):大约需要 7 秒来处理(要自动填充某些字段,我们可能需要进行数据库查找)
我们的流应用程序必须以非阻塞方式处理这两种类型的事件。也就是说,如果一种表单的大型事件上传到某个分区,它不应该阻止该分区中另一种表单的事件处理。

提出的解决方案和挑战:

  1. 每个表单的专用分区:为 5000 个表单分配 5000 个分区,由 Kafka Streams 进行基于线程的并行处理(例如,要处理 5000 个表单的事件,我们需要大约 600 个八核服务器进行并行处理)缺点:这种方法随着分区数量的增加,分区重新分配时间显着增加。
  2. 使用 Kafka 并行消费者:在 600 个八核实例中分配(表单数/线程数)5000/8 = ~600 个分区,允许每个分区处理 8 个表单的事件。但并行消费者缺乏有状态流处理等功能。

这两种方法的问题在于,启动 600 个实例对于初创公司来说成本高昂,但我们也不希望我们的 Web 应用程序的性能受到影响。

apache-kafka kafka-consumer-api apache-kafka-streams
1个回答
0
投票

tl;dr - 删除远程数据库调用和文件处理。库并不重要,因为两者都可以完成您想要做的事情,而无需您建议的实例数量


线程必须等于核心似乎存在误解。对于绝对性能来说这可能是正确的,但每秒 10K 事件可以轻松完成少得多

不应阻止该分区中其他表单的事件处理

这就是多线程和/或分区的全部目的。多重处理只是一个额外的好处。

使用 Excel 文件上传完整的表单数据

我认为您的表单具有明确定义的结构,可以是键值对?即,html 元素 id 映射到字符串、数字、布尔值、数组等?如果是这样,那就是你应该重点改进的地方。如果表单生成 Excel 文件,它们还可以生成对 Kafka 处理更友好的格式(例如 Msgpack、Protobuf、Avro)。

要自动填充某些字段,我们可能需要进行数据库查找

使用疾病预防控制中心。将表转换为流,然后使用流表连接在 Kafka 中本地进行表查找。

© www.soinside.com 2019 - 2024. All rights reserved.