multithreading - Apache kafka消息调度和负载均衡

标签 multithreading message-queue publish-subscribe apache-kafka

我刚刚开始使用 Apache Kafka,并真正尝试弄清楚,如何设计我的系统以正确地使用它。

我正在构建处理数据的系统,实际上我的数据 block 是一个需要处理的任务(对象)。并且对象知道如何处理它,所以这不是问题。

我的系统实际上分为 3 个主要组件:发布者(生成任务的代码)、传输 - 实际上是 kafka 和一组消费者 - 实际上是工作人员从队列中提取数据并以某种方式处理它。需要注意的是,消费者本身可以是发布者,如果它的任务需要两步计算(消费者只需创建任务并将其发送回传输)

因此,我们可以从以下想法开始:我有 3 个服务器:1 个单根发布者(kafka 服务器也在那里运行)和 2 个实际处理任务的消费者服务器。数据工作流程是这样的:发布者创建任务,将其放入 transposrt,然后消费者之一从队列中取出该任务并处理它。如果每个消费者都能处理与其他消费者相同数量的任务(因此工作负载在消费者之间平均分配),那就太好了。

在这种情况下我需要使用哪种 kafka 配置模式? kafka是否具有一些消息平衡功能,或者我需要创建2个分区,并且每个消费者将仅绑定(bind)到单个分区并且只能使用该分区中的数据?

最佳答案

在kafka中,分区数量大致相当于系统的并行度。

一般提示是为每个主题创建更多分区(例如 10),并在创建使用者时指定与分区数量相对应的使用者线程数量。

High-level consumer API创建使用者时,您可以提供要为每个主题创建的流(线程)数量。假设您创建 10 个分区并从一台计算机运行使用者进程,则可以将 topicCount 指定为 10。如果您从 2 个服务器运行使用者进程,则可以将 topicCount 指定为 5。

请引用此link

createMessageStreams 调用注册主题的使用者,这会导致重新平衡使用者/代理分配。 API 鼓励在一次调用中创建多个主题流,以最大限度地减少这种重新平衡。

您还可以使用 kafka/bin 下的 kafka-add-partitions.sh 命令动态增加分区数量。增加分区后,您可以使用增加的 topicCount 重新启动消费者进程

此外,在制作时您应该使用 KeyedMessage基于消息对象中的一些随机键的类,以便消息均匀分布在不同的分区上

关于multithreading - Apache kafka消息调度和负载均衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27474486/

相关文章:

C# 如何检测一个对象是否已经被锁定

java - 如何拒绝消息

ruby-on-rails - 与 PubSubHubbub 实时

java - Spring 发布订阅?

android - 屏幕关闭时互联网连接明显暂停

android线程管理onPause

java - 带有线程池的服务框架

java - JMS/消息队列的真实使用?

jms - ActiveMQ 或 RabbitMQ 或 ZeroMQ 或

msmq - NServiceBus 是否支持同一物理机上同一订阅者的多个实例?