使用 Kafka 进行一对一和群组消息传递

One to One and Group Messaging using Kafka

由于 Kafka 具有基于主题的发布-订阅架构,我如何使用 Kafka 处理 Web 应用程序的一对一和群组消息传递部分? 我正在使用 SpringBoot+Angular 堆栈和 Docker Kafka 服务器。

By One-to-One, I suppose you mean one producer and one consumer i.e. using at as a queue.

这对于 Kafka 来说当然是可能的。您可以让一个消费者订阅一个主题,并通过不授权来限制其他消费者。参见 Authorization in Kafka

请注意,一旦消息被消费,它不会被删除,而是被提交,这样同一个消费者就不会再次消费它。

By Group Messaging, I suppose you mean one producer > multiple consumers or multiple-producer > multiple-consumers

这也是可以的,一个生产者可以向一个主题生产消息,多个消费者可以消费它们。

如果所有的消费者都有相同的组id,那么组中的每个消费者只会得到消息的一个子集。

如果他们有不同的组 ID,那么每个消费者都会收到所有消息。

多个制作人也可以制作同一个主题。

一个消费者也可以订阅多个主题。

好吧,这是个很复杂的问题,我试着输入一些简单的基本信息。

Kafka topics are divided into a number of partitions. Partitions allow you to parallelize a topic by splitting the data in a particular topic across multiple brokers — each partition can be placed on a separate machine to allow for multiple consumers to read from a topic in parallel.

因此,如果您使用分区,则意味着您有多个消费者并行消费一些。

consumer groups for a given topic — each consumer within the group reads from a unique partition and the group as a whole consumes all messages from the entire topic.

基本上,你可以只有一个组,那么消息就不会在同一个消费者组中被处理两次,这就是Kafka交付的方式exactly once

如果你需要两个消费组,你需要想想为什么需要两个?两组中的消费者是否处理不同的逻辑?

还有很多,请查看official document,或者您可以回答一个较小的问题。

我会在这里写另一个答案。 根据我使用聊天服务的经验。所有消息只需要一个主题。使用精心设计的 Message 机身。

public class Message {
 private String from; // user id
 private String to;  // user id or group id
}

然后你可以为这个主题创建大约 100 个分区,并创建两个消费者来消费它们(一开始一个消费者 50 个分区)。 然后,如果您的系统达到瓶颈,您可以更轻松地扩展 X 多个消费者来处理负载。

如何在消费者中分发消息。我曾经将消息发送到移动应用程序,因此所有应用程序都与服务器建立了长期存在的连接,并且服务器通过该通道将消息发送到应用程序。对于群聊,我创建了一个Redis缓存来存储群中所有活跃的用户,这样我就可以更容易地找到属于这个群的用户,向他们发送消息。

还有一点,Kafka是无状态的,就是说Kafka没有和业务逻辑解耦,只是作为一个消息系统,传递消息。如果你把你的业务逻辑连接到 Kafka,比如创建一个主题 "One-to-One" 并在完成后删除一些,Kafka 会很乱。