我们一直在鼓吹木制品,以解决在托管apache(必须是apache)反向代理的服务器上遇到的问题。我发布此邮件的目的是希望跳出一些我们尚未考虑检查的内容。
这是一个在微服务之前使用Zuul网关的Spring引导应用程序,以及升级为可与Spring引导库一起运行的旧版Spring MVC应用程序。当旧版应用程序发生更改时,将在实体服务上调用路由,并且AMQ用于发送mqtt消息,通知新应用程序检查MS sql服务器数据库的状态并更新由Ember驱动的Web显示。所有这些都通过2个Apache反向代理运行。两者中的第一个是出现问题的地方。
Client (C) -> Reverse Proxy 1 (RP1) -> Reverse Proxy 2(RP2) -> Service (S)
C: running on Ember.js framework, with ember-paho-mqtt library
它在本地开发人员中运行良好,但是当部署到Windows登台服务器上后,该应用在几分钟后失败,然后netstat在托管apache反向代理的服务器上显示出一系列close_wait状态,这些状态不会消失。我们相信那些失败是导致失败的原因,而不是导致失败的原因,但是某些线程池可能正在耗尽某些线程池,可能是apache使用的线程池-例如客户端尝试不必要地连接?但是close_waits发生在服务器收到一条消息,告诉它关闭连接,已经完成对所有正在处理的数据的处理,但是还没有收到客户端的回音告诉它完成工作时,对吗?
Web UI失败,但是在更直接地进行测试时,现有连接将继续工作,有时系统最终会恢复,有时不会。
旧版应用程序已部署到JBoss,微服务已部署到RedHat Tomcat服务器。
我们还将azure云服务用作复杂的oauth2授权过程的一部分。
我是团队的成员,仅参与项目,主要涉及上述遗留应用程序。我们认为,当更改旧版应用程序数据并将消息发送到Spring Boot微服务时,就会出现问题,并且罪魁祸首与Websockets有关。但是我对架构的理解比我想要的还要模糊,对此感到抱歉。
我们确实有一些现有的理论。几年前,我在'nix上开发了一个Netty网络应用程序,并通过设置Java中的线程限制可以避免一堆close_waits。 AMQ在后台使用Netty,因此一种选择可能是将其换出并放入RabbitMQ。我们将Paho用于mqtt,并且一直在努力地确保如何关闭连接。我还阅读了websockets.io可能会导致此类问题,而替换更简单的SockJS可能会有所帮助。我们尝试设置和撤消各种超时/ keepalive,但均未成功。我们已经了解到Apache的线程限制可能是通过我们对其进行配置的方式进行的,但是增加它可能会冒着内存交换带来的麻烦而使事情变得更糟。
因此,我们紧抓稻草,欢迎任何抛弃我们的生命线。我会尽力为感兴趣的人士提供更多信息。