将消息从 Kafka 路由到连接到应用程序服务器集群的 Web 套接字客户端

Routing messages from Kafka to web socket clients connected to application server cluster

我想找出将消息从 Kafka 路由到连接到负载平衡应用程序服务器集群的 Web 套接字客户端的最佳方法。我知道 spring-kafka 有助于消费消息并将消息发布到 kafka 主题,但是当连接到分布式 kafka 主题时,它如何在负载平衡的应用程序服务器场景中工作。以下是我想要满足的要求,总体目标是在具有非常非常大的用户量的应用程序中促进点对点消息传递:

  1. Web 客户端可以通过负载平衡器通过 Web 套接字连接连接到 tomcat 应用程序服务器。
  2. Web 客户端可以将 message/notification 发送到连接到不同 tomcat 应用程序服务器的另一个客户端。
  3. 消息保存在数据库中并发布到 kafka topic/partition,可以被适当的网络使用 clients/users。
  4. Kafka 可以扩展到具有许多消费者的许多代理。

我可以看到如何在单个应用程序服务器中很容易地实现这一点 scenario 消费者消费来自 kafka 主题的所有消息并通过 spring messaging/websockets 重新分发.但是我无法弄清楚这在负载平衡的应用程序服务器场景中如何工作,在这种情况下,每个应用程序服务器上都有消费者形成 kafka 主题的整体消费者组。假设每个应用程序服务器都在使用 sub-sets/partitions 的 kafka 主题,它们如何知道它们的预期接收者连接到哪个服务器?即使他们知道他们的收件人连接到哪个服务器,他们将如何通过 websockets 将消息路由给他们?

我认为应用服务器负载平衡可以通过将具有特定路由键(用户以 'A' 等开头)的用户登录到特定应用服务器,然后只为以 [ 开头的用户消费消息来工作=27=] 在该应用程序服务器上。但这似乎很难维护,并且会使自动缩放变得非常困难。这似乎应该是一个常见的实施方案,但我找不到适合这种方案的任何工具或方法。

听起来每个消费者都应该生活在自己的消费者群体中。这样所有可用的消费者都将使用发送到主题的所有消息。因此,所有连接的 websocket 客户端都将收到这些消息的通知。

如果您需要这些消息的更复杂逻辑,请访问 食用后,例如过滤、路由、转换、聚合等,你应该考虑在你的项目中涉及 Spring 集成:https://spring.io/projects/spring-integration

向所有消费者广播可能有效,但最有效的解决方案应该将消息路由到准确地为目标用户保持 websocket 连接的节点。据我所知,分布式系统中的路由可以按如下方式完成:

  1. 将路由信息放在一个中间件中,比如Redis;或者自己实现一个服务来跟踪所有的会话。即集中解决
  2. 让websocket服务器自己找路由。在这种情况下,应该考虑像gossip这样的共识算法。