如何在 tomcat + jersey 之上在 java 中实施可扩展聊天 API?

How can I implement a scalable chat API in java, on top of tomcat + jersey?

我需要在 Java 中实现一个聊天服务器 API,使其能够水平扩展。我目前正在使用 tomcat + jersey + postgresql 服务器端来实现类似 REST 的层,建议的解决方案与这些技术一起使用会很好,但如果我认为最好的解决方案在于其他java技术可以讨论

我一直在研究 websockets 和一些聊天示例,从 tomcat websockets 聊天开始,但它们是有状态的,不太适合扩展。

我的看法是,通过使用 websockets 方法,我可以通过将状态存储在数据库中来获取每个节点的状态,但是我需要某种 pub/sub 机制让所有节点能够将新消息推送给他们绑定到参与聊天室的客户。

因为我不想重新发明轮子,所以我希望能够通过组合现有的和经过尝试的技术来制定解决方案。提前致谢。

请查看解决方案:

http://www.programmingforliving.com/2013/08/websocket-tomcat-8-ServerEndpointConfig-Configurator.html

或此处:

http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java?view=markup

如果您不想重新发明轮子,我建议使用 Jabber/XMPP 服务器,例如 ejabberd 或 Openfire(如果您真的想要 Java 解决方案)。它不是 RESTful,而是一个行业标准的聊天服务器,并且可以水平扩展。

看看 Cettia - Java 服务器的 quick start guide and clustering section,它是为满足这种用法而设计的。

cettia 应用程序旨在 运行 在 Grizzly、Netty、Play、Servlet、Vert.x 等上,并且在服务器之间不共享任何内容以便于扩展(pub-sub 系统就足够了).

这里有一些例子供您参考:

我是该项目的作者。如果您介意它处于 alpha 阶段,您可能想尝试 Atmosphere,它与 Cettia 类似但提供 GA。