【问题标题】:Broadcasting message to clients向客户端广播消息
【发布时间】:2016-12-02 23:10:38
【问题描述】:

设计

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

问题陈述

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

解决方案1

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

缺点解决方案1

在可运行的 JAR 中,在所有客户端代理上部署 Axis2/Jetty/Similar webserver。考虑到这是在所有客户端代理上部署网络服务器,其数量可高达 150000,是否可取?另外,如果所有客户端机器上都有网络服务器,应用程序是否可以通过安全认证?

解决方案2

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

缺点解决方案2

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

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

【问题讨论】:

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


    【解决方案1】:

    您的解决方案 1 存在另一个问题 - 每个人都知道服务器,但服务器不会知道所有客户端。当然你可以在服务器上做一个客户端注册工作流,但是发布消息会让服务器很重

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

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

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

    1. 如果需要传输速度,您也可以使用 websocket。但这不如选项 1,因为它的资源使用情况。但是,如果您不担心的话,websocket 是一种超酷的全双工通信方式。

    【讨论】:

    • 我们的架构师团队提出了一个解决方案,即仅在服务器代理上拥有 Web 服务,并且所有客户端代理都会定期轮询服务器代理。这样,它就避免了在所有远程代理上都有 Web 服务器。还考虑了 JMS。这是最好的解决方案之一。但是考虑到给定的解决方案足以满足项目的所有要求,JMS 被忽略了。谢谢你的回答。它鼓励我们进行更多的辩论和分析。
    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多