Web Sockets + Tomcat/Glassfish + 集群 + 负载平衡 - 都有哪些选项?

Posted

技术标签:

【中文标题】Web Sockets + Tomcat/Glassfish + 集群 + 负载平衡 - 都有哪些选项?【英文标题】:Web Sockets + Tomcat/Glassfish + Cluster + Load Balancing - What are the options?Web Sockets + Tomcat/Glassfish + 集群 + 负载平衡 - 有哪些选项? 【发布时间】:2012-11-14 19:30:36 【问题描述】:

我正在开发可能使用 Tomcat 7 或 Glassfish 3.1(可能是 GlassFish,但尚未确定)的 Java SE 7 / Java EE 6 应用程序。该应用程序将利用新的 WebSockets 技术,该技术最近已在所有主要浏览器中得到广泛采用。

通过大量研究、论坛阅读和邮件列表监控,我确定(目前,AFAICT)mod_jk/isapi_redirect 和 mod_proxy 都不可靠(或根本不)支持 WebSockets。由于这是在 Tomcat 或 GlassFish 集群中负载平衡/引导流量的两种久经考验的方法,因此这显然是一个问题。

然而,另一方面,Tomcat 和 GlassFish 都有内置的 Web 服务器,这些服务器被广泛吹捧为在提供静态内容方面与 Apache 或 IIS 一样高效,因此通常不建议放置 Apache 或 IIS在这些服务器之一的前面,除非您需要冗余/负载平衡。

所以,所有这些都让我想到了这些问题:

    Tomcat/GlassFish 集群中是否还需要 Apache 或 IIS 来实现负载平衡?简单地放置一个标准负载均衡器,就像您在任何其他场景中使用的一样,放在 Tomcat 或 GlassFish 服务器集群之前并完全放弃中间 Web 服务器,难道不是同样有效(或更有效吗?)?还是还有一些技术原因导致标准负载均衡器无法与 TC/GF 一起使用?假设可以使用标准负载均衡器,您可以简单地找到支持 WebSockets(如 Coyote)的负载均衡器并使用它。 如果标准负载平衡器根本无法与 Tomcat/GlassFish 一起使用,还有哪些其他选项?如何使用 Java EE 实现高性能和可靠的 WebSocket 技术?

警告:我不想考虑仅限于愚蠢的循环协议(例如循环 DNS)的负载平衡技术。我不认为这些选项可靠/冗余,因为与集群中的另一台服务器相比,这些选项很容易被发送到已关闭或已经处理更多连接的服务器。显然,我知道像 Round-Robin DNS 这样的东西可以很容易地与 WebSockets 一起使用,而没有任何兼容性问题。

【问题讨论】:

【参考方案1】:

我们将使用一种方法,将我们的 Tomcat 实例直接放在标准负载均衡器之后。我们在设置中大量使用 SSL。为了让负载均衡器后面的事情保持简单,并避免在我们的 Web 容器中对 SSL/无 SSL 进行不同的配置,我们希望在负载均衡器中终止 SSL。

但是,我们的负载平衡器的 SSL 解密硬件有很多问题。因此,我们最终在 Web 容器和负载均衡器之间使用了 Web 服务器 (nginx),其唯一目的是解密 SSL。

这是一个适用于我们的特殊情况,但值得牢记。除此之外,我认为没有理由在负载均衡器和 Web 容器之间保留 Web 服务器。负载均衡器应该可以与 Web 容器一起正常工作。力求简单并尽量减少设置中的不同组件。

【讨论】:

绝对有帮助,而且我没有考虑过:SSL。我的理解是 F5 和 Coyote 负载均衡器都非常适合 TLS/SSL,所以这不应该对我在这里的考虑产生影响。但是,在此过程中我应该牢记这一点,以确保覆盖基础。 (在我将此标记为已回答之前,我会等着看是否有其他人提供更具体的细节。) nginx的SSL比tomcat的SSL快多少? @irreputable 对我们来说这不是关于速度的问题。据我从我们的运维人员那里了解到,这是为了便于管理并最大限度地减少我们散布证书的地方的数量。因此我不知道速度。 @irreputable,克里斯托弗是对的。部署私钥和证书的地方越少越好。我也听说(虽然我自己没有经历过)在 Tomcat 中配置 SSL 是一个真正的 PITA。

以上是关于Web Sockets + Tomcat/Glassfish + 集群 + 负载平衡 - 都有哪些选项?的主要内容,如果未能解决你的问题,请参考以下文章

django Web-Sockets 设计和内存数据存储

Web Sockets - 向所有客户端发送消息

为啥 Web Sockets 不使用 SOAP?

用于双向消息流的 HTTP/2 与 web-sockets

没有分配功能的 Web Sockets 对象

在西雅图 C++ Builder 10 中使用 Web.Win.Sockets