Apache kafka消息调度和平衡加载

时间:2014-12-14 21:44:19

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

我刚刚开始使用Apache Kafka并且真的想弄明白,我怎样才能设计我的系统以正确的方式使用它。

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

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

所以我们可以从创意开始,我有3个服务器:1个单根发布者(kafka服务器也在那里运行)和2个实际处理任务的消费者服务器。数据工作流就是这样的:发布者创建任务,将其置于转置,而不是一个消费者从队列中获取此任务并处理它。如果每个消费者将处理与其他消费者相同的任务(因此工作量在消费者之间传播),那将是很好的。

我需要使用哪种kafka配置模式? kafka是否有一些消息平衡功能,或者我需要创建2个分区,每个消费者只能绑定到单个分区,并且只能使用来自该分区的数据?

1 个答案:

答案 0 :(得分:1)

在kafka中,分区数大致转换为系统的并行性。

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

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

请参阅此link

The createMessageStreams call registers the consumer for the topic, which results in rebalancing the consumer/broker assignment. The API encourages creating many topic streams in a single call in order to minimize this rebalancing.

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

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