【问题标题】:Clustering Websockets Tyrus Java集群 Websockets Tyrus Java
【发布时间】:2017-04-06 04:46:13
【问题描述】:

我在 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 会话对象不可序列化。

我该如何解决我的问题?

谢谢

【问题讨论】:

  • 您是否尝试过编写自己的自定义序列化程序方法? stackoverflow.com/a/7290812/212224
  • 是的,我试过了,但效果不好。我正在尝试使用 Hazelcast Executor Service,但它会导致 com.hazelcast.nio.serialization.HazelcastSerializationExcept‌​ion: java.lang.ClassNotFoundException: com.MyTask .

标签: java websocket cluster-computing hazelcast payara


【解决方案1】:

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

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

(已编辑) 在我建议使用 Hazelcast executor service 代替主题之前,但这会导致类加载器问题。

【讨论】:

  • 我尝试了 Hazelcast 执行器服务。我的任务实现了 Runnable & Serializable 但是当我调用 executorService.executeOnAllMembers(new MyTask(input)) 时,这会在其他节点上抛出 com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: com.MyTask。只是,仅供参考,我以这种方式检索 Hazelcast 实例: Context ctx = new InitialContext(); HazelcastInstance 实例 = (HazelcastInstance) ctx.lookup("payara/Hazelcast");
  • 这是真的 - 我没有意识到嵌入式 Hazelcast 实例无法访问已部署应用程序中声明的类,因为类路径隔离。尝试使用Hazelcast Topic 广播消息并将监听器放入应用程序(我更新了我的回复)
  • 我使用了 Hazelcast 主题,它似乎工作正常。感谢您的支持。
【解决方案2】:

如果您不想/不能向您的类添加任何序列化逻辑,请查看 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

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

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

【讨论】:

  • 感谢您的支持,但我更喜欢使用 Hazelcast 主题在节点上共享消息,而不是序列化会话对象。很复杂。
猜你喜欢
  • 1970-01-01
  • 2017-10-25
  • 2021-01-10
  • 2014-11-19
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多