集群事件驱动的 Java 应用程序 - 我应该使用 Websockets 还是轮询?

Posted

技术标签:

【中文标题】集群事件驱动的 Java 应用程序 - 我应该使用 Websockets 还是轮询?【英文标题】:Clustered event driven Java application - Should I use Websockets or polling? 【发布时间】:2015-07-18 12:00:38 【问题描述】:

我正在创建一个监控用户活动的监控应用程序。我的系统中有四个元素:

EventCatcherEventCatcher负责捕捉子系统中发生的所有事件,并将数据推送到EventHandler。根据观察,平均每秒有 10 个事件被推送到EventHandler。一些事件是 UserLogin、UserLogout。

EventHandlerEventHandler 是一个单例类,它处理来自EventCatcher 的所有传入事件。它还跟踪系统中所有登录的用户。因此,每当EventHandler 接收到UserLogin 事件时,就会从事件中提取User 对象并存储在HashMap 中。当收到 UserLogout 事件时,该 User 对象将从 HashMap 中删除。此类还维护所有活动 Websocket 会话的Set,因为每次发生事件时,我都想通知所有打开的会话发生了特定事件。

Websocket Endpoint:这只是一个用@ServerEndpoint注解的简单Java类。

Clients: 我要构建的系统仅供内部(公司)使用。在生产中,最多只有大约 5 到 10 个客户端。每次发生事件时,所有客户端都会收到相同的信息。

所以现在我正试图让我的主管相信 Websockets 是可行的方法,但是,我的主管发现它真的没有必要,因为一个简单的轮询解决方案就可以解决问题。

他的观点是:

    我们并不真正需要毫秒级的最新信息。我们可以每秒轮询一次。 如果我要维护一个打开的 WebSocket 会话列表,这将如何在集群环境中工作(我们使用负载平衡器) 如果我计划在每次发生事件(UserLogin、UserLogout)时向客户端发送信息,我应该能够只向所有 WebSocket 会话发送小的更新 - 这意味着,我不能发送整个 JSON 转储一切。这意味着,对于每个 WebSocket 实例,我必须维护另一个用户集并正确维护它以镜像 EventHandler 中包含的集。

我的主管建议我丢失 WebSocket 并将其转换为简单的 Servlet 并让客户端每秒轮询一次以接收整个 JSON 转储。

在这种情况下,我应该坚持使用 WebSockets 吗?还是我应该只投票?

据我所知,Websockets 与轮询的主要优势在于,通过使用 Websockets,您将拥有从客户端到服务器的持久连接。 HTTP 并不是真正用于实时数据。

此外,轮询需要每次都发送一个 HTTP 请求,并且每个请求都带有 HTTP 标头。如果 HTTP 请求标头包含 800 个字节,那么每个客户端每分钟发送 48kb。使用 WebSocket,这不是问题。

但话又说回来,我们真的不会有很多活跃的客户。我们不担心第三方嗅探我们的请求,因为该系统仅供公司使用 - 内部使用!而且我相信我的主管想要一些简单可靠的东西。

无论哪种方式我都很好。我只是想确定我是否使用了正确的工具来完成这项工作。

附加问题:如果 WebSockets 是要走的路,我有什么理由考虑轮询吗?

【问题讨论】:

您的网络是否真正关心每分钟 48Kb/客户端?这是一个非常低的数据速率,令人担忧。 WebSockets 是闪亮的新玩具,但轮询对于这类应用程序似乎很好。在集群环境中维护会话似乎会引入额外的复杂性和故障点(如果集群成员之一发生故障怎么办?)。使用客户端定期轮询的简单 Web 服务,您不必担心会话管理。我的两分钱...... @pens-fan-69 这是我的主管正在考虑的问题。有很多文章和博客说 WebSockets 是未来。显然,看起来我只需要一个简单的解决方案来解决这个应用程序,轮询就足够了。谢谢您的意见!非常感谢。 【参考方案1】:

WebSocket 的全部目的是有效地支持客户端和服务器之间的持续连接。

我不清楚你是如何实现你的应用的。如果这是在 Servlet 环境中运行的 Web 应用程序,利用 Web 服务器中的 WebSocket 支持,请注意您需要使用最新版本的 Servlet 容器。例如,对于 Tomcat,您必须使用版本 8 或版本 7 的最新更新。

当然,Web 浏览器必须支持 WebSocket。

请注意,WebSocket 仍然是一项新技术,在规范和实现方面一直在变化和发展。

气氛

您可能需要考虑使用Atmosphere 框架。 Atmosphere 支持Push 的多种技术,包括 WebSocket 和 Comet。

Vaadin web-app 框架利用 Atmosphere 为您的应用中的 Push 提供自动支持。默认情况下,WebSocket 会首先自动尝试。如果 WebSocket 不可用,Vaadin+Atmosphere 会自动回退到其他技术,包括轮询。

【讨论】:

以上是关于集群事件驱动的 Java 应用程序 - 我应该使用 Websockets 还是轮询?的主要内容,如果未能解决你的问题,请参考以下文章

使用 datastax java 驱动程序 2.1.4 连接到 Cassandra 集群的速度太慢

: java.sql.SQLException: 尝试使用 Databricks Connect 在 Databricks 集群上运行 Python 脚本时没有合适的驱动程序

如何通过 Java 驱动程序正确连接到 Atlas M0(免费层)集群?

Cassandra java驱动程序 - 使用多线程提取数据时的高延迟

如何使用 Postgres 数据库在 Java 中获得异步/事件驱动的 LISTEN/NOTIFY 支持?

Oracle RAC,我需要 XA 驱动程序吗?