我正在公司中实施一个新的应用程序,并且正在寻找进行集群的方法。根据jboss文档here,有两种可用的体系结构。
客户端拦截器
外部负载平衡
问题1:在客户端拦截器体系结构中。客户端具有代理对象,并且它知道将消息路由到哪个服务器。谁是这里的客户?我知道Java脚本/ HTML无法保存代理对象。它是节点前面的spring / servlet层吗?
问题2:外部负载平衡器是否了解有关节点可以包含的代码和服务的任何信息,还是仅使用算法将请求委托给谁?
最佳答案
对于1-客户端,是远程EJB动态代理和/或应用程序客户端容器(桌面应用程序)
对于2-外部负载平衡器对代码一无所知。
(我看到此解决方案的使用远远超过问题1中的方案)
有很多方法可以配置群集,具体取决于您的负载平衡和容错目标。例如,您可以在未集群的应用程序服务器之间进行负载平衡。由于没有会话复制,因此容错性较小,性能更快。
这里是有关数字1的更多详细信息。
假设问题1中有一个分布式应用程序。假设一个Web应用程序和在应用程序服务器上运行的EJB,我希望调用另一个应用程序服务器的一些EJB。
当您调用远程EJB时,应用程序服务器会生成一个类,该类将被传输到调用服务器。这是动态代理,它包含所有网络通信内容。
在应用服务器市场上,我们通常会看到两种配置形式:(1)动态代理类,该类可感知集群并调用其他节点;(2)带有节点列表(即corbaloc :: nodeA)的CORBA URL。 host.com,nodeB.host.com / ...
这是关于数字2的更多细节。
第二种情况通常是我们向“外部”世界的调用者提供基于HTTP的服务,WebUI,REST,SOAP等。
带有mod_jk插件的Apache HTTPD是JBoss文档here中的示例
可以将请求发送到其他服务器以解决负载或故障。 HTTP会话对象在节点之间复制。 (JBoss中的JGroups库可以处理此问题,IP多播也是一种常见技术)
因此,负载平衡器/反向代理不需要知道它只知道将请求转发到的URL的代码,集群中的应用程序服务器将协作以获取会话信息。