1

我在 Payara 服务器上实现了一个集群,其中 3 个节点(A、B 和 C)作为独立实例。我使用 HAproxy 作为负载均衡器,一切正常。

我在我的项目中添加了 WebSockets,当客户端请求 websocket 时,HAProxy 会自动从 HTTP 切换到隧道模式。

我的问题是:无论连接的节点如何,我都需要检索 websocket 会话。例如:“我有 3 个用户连接到应用程序。用户 1 和用户 2 连接到节点 A。用户 3 连接到节点 B。节点 C 上发生需要通知用户 1 和 3 的事件。但我还没有参加 Node C 用户 1 和用户 2 会话。”

我尝试使用 Hazelcast 分布式列表在用户连接处存储会话(OnOpen 方法)。但是当我在列表中调用“add”方法时,这会引发 HazelcastSerializationException,因为 Tyrus 会话对象不可序列化。

我该如何解决我的问题?

谢谢

4

2 回答 2

1

我怀疑传输 WebSocket 会话会对您有所帮助,因为您需要从他们连接的节点通知用户。

您可能希望从节点 C 通知节点 A 和 B,以便更新连接到它们的用户。为此,您可以使用Hazelcast 主题向集群中的所有节点发送消息,并通过具有 WebSocket 会话(已编辑)的节点检索消息。您需要将信息从节点 C 获取到具有会话的其他节点,而不是相反。将会话传递给另一个节点是没有用的,因为会话仅适用于打开的 WebSocket 连接。

(已编辑)在我建议使用Hazelcast 执行程序服务而不是主题之前,但这会导致类加载器问题。

于 2016-11-24T00:54:27.467 回答
1

如果您不想/不能向您的类添加任何序列化逻辑,请查看 StreamSerializer。

http://docs.hazelcast.org/docs/3.7/manual/html-single/index.html#custom-serialization

如果您可以添加序列化逻辑,请查看 IdentifiedDataSerializable:

http://docs.hazelcast.org/docs/3.7/manual/html-single/index.html#identifieddataserializable

参考手册中有完整的示例。

你需要确保对象真的可以被序列化。有些对象不应该被序列化。

于 2016-11-23T15:31:53.360 回答