0

我目前正在使用具有与以下聊天类比匹配的设置的应用程序:

  • 聊天是保存在内存中并包含聊天消息列表的对象
  • 在多个浏览器窗口中呈现聊天,并使用 a4j:push 拉入更新

编程设置如下所示:聊天对象的实例及其消息在不同会话中的 PAGE 范围接缝组件之间共享。现在,当任何会话发布新消息时,即修改聊天对象时,应通知所有接缝组件新消息,以便可以将新状态中继到所有客户端的 UI。

我可以想到三种方法来实现这一点:

  1. Seam 以聊天 ID 作为参数的事件,然后每个组件检查 ID 并更新或忽略消息
  2. JMS 队列或一个 JMS 主题,其中每个组件使用过滤器进行侦听以仅用于聊天
  3. 共享聊天对象中的纯Java侦听器机制,即每个seam组件都注册到它,通知是纯Java直接的

为了便于讨论,假设聊天的数量很大(数万)而聊天用户的数量很小(比如说 2-10)。

每个规模的表现如何?您还有其他建议如何使用 Seam 实现这一点并表现良好吗?

正如我所看到的,(1)将被集成和清洁,但最终你会通知数以万计的组件,其中只有少数真正需要它。所以它可能不会扩展。

(2) 将被集成并且仅取决于 JMS 提供者(可以交换)的性能,并且也可以在集群环境中工作而无需修改。我不确定 JMS 在这里的性能,即每秒几百条消息和数千个具有不同过滤器的侦听器是否很多?

(3) 会很快,因为只会通知所需的组件,并且通知是纯 java 的。但是,由于跨会话/组件/线程完成了某些事情,可能会出现并发/访问问题。

对于 (1) 和 (3),如果在某些时候需要,必须手动添加支持集群的解决方案。

4

1 回答 1

1

我推荐2)。我还建议将 JMS 排除在外 - 即使它可以让您切换消息传递提供程序,它也会阻止您使用消息传递系统的更高级功能。如果您使用的是 Oracle 数据库,AQ将是一个明智的选择(它支持 JMS 顺便说一句。)。否则,我建议使用 AMQP,它应该可以通过JBoss Messaging或第三方解决方案(如RabbitMQ )获得。

由于您显然有消息传递问题,因此您应该选择使用消息传递解决方案。

于 2009-09-26T20:32:36.537 回答