我是不是需要在 DB 上进行会话集群以在 AWS/EC2 上使用 HAProxy 对 Jetty WebSockets 服务器进行负载平衡?

Posted

技术标签:

【中文标题】我是不是需要在 DB 上进行会话集群以在 AWS/EC2 上使用 HAProxy 对 Jetty WebSockets 服务器进行负载平衡?【英文标题】:Do I need session-clustering on a DB for load balancing a Jetty WebSockets server with HAProxy on AWS/EC2?我是否需要在 DB 上进行会话集群以在 AWS/EC2 上使用 HAProxy 对 Jetty WebSockets 服务器进行负载平衡? 【发布时间】:2016-04-17 21:32:11 【问题描述】:

我正在使用在 AWS/EC2 上运行的 Jetty 9.3.7 WebSockets 服务器使用 WebSockets 编写一个类似聊天的应用程序。架构描述如下:

(a) 服务器基于HTTPS (wss)。我正在考虑使用HAProxy,为此使用基于 IP 哈希的 LB。系统架构将如下所示:

                       -->wss1: WebSocket server 1
                      /                        
clients->HAProxy LB -->wss2: WebSocket server 2
(a, b,..z)            \
                       -->wss3: WebSocket server 3

我将根据这些 instructions 在 LB 上终止 HTTPS/wss

(b) 客户端 a...z 连接到系统,并将以各种方式连接到 wss1wss2wss3 等。

(c) 现在,我的 WebSocket 应用程序如下工作。当其中一个客户端推送消息时,它被发送到客户端连接到的 WS 服务器(比如wss1,然后该消息被传播给其他几个客户端(客户端集在我的程序中以编程方式确定)在wss1 上运行的WebSocket 应用程序。例如,a 创建一条消息Hey guys! 并将其推送到wss1,然后将其推送到客户端bc,以便bc接收Hey guys! 消息。b 具有到服务器 wss2 的 WebSocket 连接,c 具有到 wss3 的 WebSocket 连接。

我的问题是,要从消息接收服务器推送消息,如上面的 (c),wss1 需要知道到 bc 的 WebSocket 会话/连接很可能在不同的 WebSocket 上服务器。我可以在 Jetty 上使用会话集群来检索会话 bc 连接到吗?如果没有,在负载平衡 Jetty WebSockets 时提供此查找的最佳方式是什么?

其次,如果我确实使用会话集群或某种此类方法来检索会话,我如何使用wss1 上的bc 的会话将消息发送到bc ?除了服务器之间的某种通信之外,似乎没有办法做到这一点。这是正确的吗?

如果我必须为此使用会话集群,是否有一个 github 示例可以指点我?

谢谢!

【问题讨论】:

我的问题的 TL;DR 版本是:在***.com/questions/15646213/… 中,Joakim 的响应描述了如何检索本地存储在同一服务器上的 WebSocket 会话。当会话在不同的服务器上时,我该如何实现?如果会话集群是一种方式,有没有可以找到 Jetty 的会话集群模式的地方? 我在这里找到了集群模式:eclipse.org/jetty/documentation/9.2.3.v20140905/… 【参考方案1】:

我认为会话集群不是一个合适的工具。支持发布和订阅模型的面向消息的中间件 (MOM) 应该足以集群多个实时应用程序。作为实时应用框架Cettia 的作者,我使用发布和订阅模型来横向扩展应用程序。

基本思路是

    要通过 MOM 交换的消息是在本地应用于每个服务器的操作。例如,操作可以是“向所有客户端发送消息”。这里的所有客户端都是指连接到服务器以执行给定操作的客户端。 每个服务器订阅 MOM 的相同主题。当主题给出一些消息时,服务器将其反序列化为操作并在本地执行操作。它发生在每台服务器上。 如果某些操作发生在某个服务器上,该服务器应将其序列化为消息并将其发布到主题。

使用 Cettia,您只需将 MOM 插入 cettia 应用程序即可。如果你想从头开始,你需要实现上面的想法。

http://cettia.io/projects/cettia-java-server/1.0.0-Beta1/reference/#clustering https://github.com/cettia/cettia-java-server/blob/1.0.0-Beta1/server/src/main/java/io/cettia/ClusteredServer.java

以下是一些 MOM 的工作示例。虽然它们是用 Cettia 编写的示例,但它可能会帮助您了解上述想法的工作原理。

AMQP 1 Hazelcast 3 jGroups 3 JMS 2 Redis 2 Vert.x 2

【讨论】:

以上是关于我是不是需要在 DB 上进行会话集群以在 AWS/EC2 上使用 HAProxy 对 Jetty WebSockets 服务器进行负载平衡?的主要内容,如果未能解决你的问题,请参考以下文章

如何将视频帧推送到 obs 服务器以在 Android 上进行移动直播

重定向 404 以在 404 模板上进行分页搜索

通过 Terraform 在 AWS 上进行路由传播

每次都在 AWS opsworks 上进行部署

如何在 Android 上进行 SSL 会话恢复

无法提交新版本以在 TestFlight 上进行测试