向客户广播消息

时间:2016-07-28 13:48:19

标签: java web-services client-server axis2 rmi

设计

服务器代理继续轮询数据库(SQL Server 2012)以查找客户端代理所需的计划和/或配置是否有任何更改。客户端代理在网络上的所有计算机上运行,​​需要从服务器代理获取更新的扫描计划和配置并更新其作业计划程序。服务器代理和客户端代理都是用Java构建的。

问题陈述

更新数据库后,服务器将数据发送到n个客户端代理。

解决方案1 ​​

在服务器和客户端代理上创建Web服务并相互消耗。每当DB中的扫描计划/配置发生变化时,服务器将调用客户端代理的方法并更新配置文件。

缺点解决方案1 ​​

在runnable JAR中,在所有客户端代理上部署Axis2 / Jetty / Similar webserrver。考虑到这是在所有客户端代理上部署网络服务器,其数量可以达到150000,是否可取?此外,如果所有客户端计算机上都有Web服务器,那么应​​用程序是否可以清除安全认证?

解决方案2

使用RMI在服务器和客户端之间进行通信。在这种情况下,客户端将保持轮询服务器,因为RMI通信是单向的。应该避免使用双向调用,因为它还涉及在每台客户机上都有服务器套接字。

缺点解决方案2

每当更新数据库时,它都无法直接向所有客户端计算机发送消息。它必须等待客户端机器轮询它。如果需要立即扫描,则所有客户端代理都需要经常轮询主代理。考虑到客户代理的数量可能很大,这是否可取? Java架构师提供的另一个缺点是RMI比webservice慢。那是对的吗?

我必须选择这两种解决方案中的任何一种,或者如果有任何第三种解决方案,你们可以给我。一个人还建议JMS作为广播方式。

1 个答案:

答案 0 :(得分:0)

您的解决方案1还有另一个问题 - 每个人都知道服务器,但服务器不会知道所有客户端。当然,您可以在服务器上执行客户端注册工作流程,但它会使服务器发布消息

我甚至不在考虑解决方案2。对我来说,RMI就像死了一样好,我们现在有更好的架构。

  1. 在订阅模型中启动消息传递队列。每当有更新推送消息到队列管理器并让队列管理器担心向所有可用客户端广播时。您可以在此处使用任何可靠的队列,例如RabbitMQ,MQTT等。
  2. 主要优势是消息可靠性。有一些选项可以确保每个订阅者都能收到消息,这很好。如果需要,您可以稍后进行推/拉。您还可以对消息队列进行集群,如果客户端数量在以后的某个时间点变高,则会创建负载平衡解决方案。

    1. 如果需要传输速度,您也可以使用websocket。但由于资源的使用,这不如选项1好。但是如果你不担心它,websockets是一种非常酷的全双工通信方式。