我目前正在使用具有与以下聊天类比匹配的设置的应用程序:
- 聊天是保存在内存中并包含聊天消息列表的对象
- 在多个浏览器窗口中呈现聊天,并使用 a4j:push 拉入更新
编程设置如下所示:聊天对象的实例及其消息在不同会话中的 PAGE 范围接缝组件之间共享。现在,当任何会话发布新消息时,即修改聊天对象时,应通知所有接缝组件新消息,以便可以将新状态中继到所有客户端的 UI。
我可以想到三种方法来实现这一点:
- Seam 以聊天 ID 作为参数的事件,然后每个组件检查 ID 并更新或忽略消息
- JMS 队列或一个 JMS 主题,其中每个组件使用过滤器进行侦听以仅用于聊天
- 共享聊天对象中的纯Java侦听器机制,即每个seam组件都注册到它,通知是纯Java直接的
为了便于讨论,假设聊天的数量很大(数万)而聊天用户的数量很小(比如说 2-10)。
每个规模的表现如何?您还有其他建议如何使用 Seam 实现这一点并表现良好吗?
正如我所看到的,(1)将被集成和清洁,但最终你会通知数以万计的组件,其中只有少数真正需要它。所以它可能不会扩展。
(2) 将被集成并且仅取决于 JMS 提供者(可以交换)的性能,并且也可以在集群环境中工作而无需修改。我不确定 JMS 在这里的性能,即每秒几百条消息和数千个具有不同过滤器的侦听器是否很多?
(3) 会很快,因为只会通知所需的组件,并且通知是纯 java 的。但是,由于跨会话/组件/线程完成了某些事情,可能会出现并发/访问问题。
对于 (1) 和 (3),如果在某些时候需要,必须手动添加支持集群的解决方案。