2

我们有一些以独立模式运行的 Wildfly 服务器。每个实例都提供了一堆无状态服务,这些服务可以通过来自某些 web 应用程序的 ejb 远程调用(http-remoting)来访问。

Web 应用程序的出站连接使用循环法指向 http 负载均衡器,没有粘性。此平衡器在连接之前检查服务应用程序的可用性。

到目前为止,这项工作,故障转移也是如此。

问题:

独立服务器的数量可能会有所不同。一旦从其中一个 Web 应用程序建立出站连接,它将永远不会关闭。所以总是到达同一个独立服务器,直到它死掉。

在重负载下,我们只是启动另一个运行独立服务器的 VM,该服务器也将被负载均衡器使用,这一目的不起作用,因为没有从 webapps 建立新连接。

问题:

这是一个可行的方案吗?是否可以将 webapps 配置为在一段时间后启动新连接、请求计数或其他什么?

我尝试在 undertow 中不让 tcp 或 http 标头保持活动状态并请求空闲时间,但到目前为止没有成功。

亲切的问候

马库斯

4

2 回答 2

0

由于 ejb 远程调用的二进制性质,没有简单的方法来动态地对 ejb 远程调用进行负载平衡。JBoss EJB 客户端支持多个远程连接的规范,这些连接以循环方式调用,但列表仍然硬编码在客户端配置中。

示例 jboss 客户端配置jboss-ejb-client.properties

endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=node1,node2
remote.connection.node1.host=192.168.1.105
remote.connection.node1.port = 4447
remote.connection.node1.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.node1.username=appuser
remote.connection.node1.password=apppassword
remote.connection.node2.host=192.168.1.106
remote.connection.node2.port = 4447
remote.connection.node2.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.node2.username=appuser
remote.connection.node2.password=apppassword

我了解,您的 Web 应用程序也是基于 Java 的。为什么不在一个.ear部署中的同一台服务器上同时运行 EJB 层和 Web 有什么理由?这样您就可以使用本地访问,甚至可以将@EJBbean 直接注入您的 Web 控制器,而无需将远程 EJB 的所有调用序列化为二进制形式,从而获得更简单的配置和更好的性能。

如果您的应用程序实际上是一个单独的部署,那么首选方法是通过 REST API(JAX-RS)公开您的后端功能。这样它就可以通过 HTTP 访问,您可以简单地从您的 Web 应用程序访问它,并且您可以像使用 Web UI 一样对其进行负载平衡(您可以选择将您的 API http 上下文保持为私有 - 仅在本地对服务可见在同一网络上,或将其公开,例如用于移动应用程序)。
希望有帮助

于 2017-05-07T19:42:57.830 回答
0

您应该使用standalone-ha.xml 或standalone-full-ha.xml 配置文件。虽然您可能不需要 ha 部分来管理集群中的有状态 bean 的状态,但您需要它让 ejbclient 自动发现集群中的其他节点

实际上,负载平衡是由 ejbclient 完成的,而不是单独的专用负载平衡器

于 2017-05-08T07:25:29.550 回答