我是不是需要在 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
连接到系统,并将以各种方式连接到 wss1
、wss2
或 wss3
等。
(c) 现在,我的 WebSocket 应用程序如下工作。当其中一个客户端推送消息时,它被发送到客户端连接到的 WS 服务器(比如wss1
,然后该消息被传播给其他几个客户端(客户端集在我的程序中以编程方式确定)在wss1
上运行的WebSocket 应用程序。例如,a
创建一条消息Hey guys!
并将其推送到wss1
,然后将其推送到客户端b
和c
,以便b
和c
接收Hey guys!
消息。b
具有到服务器 wss2
的 WebSocket 连接,c
具有到 wss3
的 WebSocket 连接。
我的问题是,要从消息接收服务器推送消息,如上面的 (c),wss1
需要知道到 b
和 c
的 WebSocket 会话/连接很可能在不同的 WebSocket 上服务器。我可以在 Jetty 上使用会话集群来检索会话 b
和 c
连接到吗?如果没有,在负载平衡 Jetty WebSockets 时提供此查找的最佳方式是什么?
其次,如果我确实使用会话集群或某种此类方法来检索会话,我如何使用wss1
上的b
和c
的会话将消息发送到b
和c
?除了服务器之间的某种通信之外,似乎没有办法做到这一点。这是正确的吗?
如果我必须为此使用会话集群,是否有一个 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 服务器进行负载平衡?的主要内容,如果未能解决你的问题,请参考以下文章