向客户端广播消息

3

设计

服务器代理不断地轮询数据库(SQL Server 2012),以查找是否需要为客户端代理进行计划和/或配置更改。客户端代理在网络上的所有机器上运行,并需要从服务器代理获取更新的扫描计划和配置,然后更新其作业调度程序。服务器代理和客户端代理均采用Java构建。

问题陈述

一旦数据库更新,服务器就向n个客户端代理发送数据。

解决方案1

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

缺点:解决方案1

在可运行的JAR中,在所有客户端代理上部署Axis2/Jetty/类似的Web服务器。考虑到这是在所有客户端代理上部署Web服务器,其中数量可以达到150000,这是明智的吗?还有,如果所有客户端机器上都有Web服务器,应用程序是否能通过安全认证?

解决方案2

使用RMI在服务器和客户端之间进行通信。在这种情况下,客户端将不断轮询服务器,因为RMI通信是单向的。应该避免使用双向调用,因为这又涉及在每个客户端机器上设置服务器套接字。

缺点:解决方案2

每当数据库更新时,它不能直接发送消息到所有客户端机器上。它必须等待客户端机器进行轮询。在需要立即扫描的情况下,所有客户端代理都需要频繁轮询主代理。考虑到客户端代理的数量可能很大,这是否明智?另一位Java架构师提出的另一个缺点是,RMI比Web服务慢。这是正确的吗?

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

1个回答

0

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

我甚至没有考虑过解决方案2。对我来说,RMI已经死了,我们现在有更好的架构。

  1. 在订阅模型中启动消息队列。每当有更新时,将消息推送到队列管理器,让队列管理器担心向所有可用客户端广播。你可以在这里使用任何可靠的队列,如RabbitMQ、MQTT等。

主要优点是消息可靠性。有选项确保每个订阅者都收到消息,这很好。如果需要,稍后可以进行推/拉。您还可以集群消息队列,如果客户端数量增加,可以在以后创建负载平衡的解决方案。

  1. 如果需要传输速度,也可以使用WebSocket。但由于其资源使用情况,这不如选项1好。但如果你不担心它,WebSocket是全双工通信的超级酷方式。

我们的架构团队提出了一种解决方案,即仅在服务器代理上拥有Web服务,所有客户端代理将定期轮询服务器代理。这样,它避免了在所有远程代理上都拥有Web服务器。JMS也被考虑过。它是最好的解决方案之一。然而,考虑到给定的解决方案满足项目的所有要求,JMS被忽略了。谢谢你的回答。它鼓励我们进行更多的辩论和分析。 - Vishal Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接