gpt4 book ai didi

java - 向客户端广播消息

转载 作者:行者123 更新时间:2023-12-01 19:44:31 25 4
gpt4 key购买 nike

设计

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

问题陈述

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

解决方案1

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

缺点解决方案1

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

解决方案2

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

缺点解决方案2

每当数据库更新时,它不能直接向所有客户端计算机发送消息。它必须等待客户端机器轮询它。如果需要立即扫描,所有客户端代理将需要频繁轮询主代理。考虑到客户代理的数量可能很大,这样做是否明智? Java 架构师告知的另一个缺点是 RMI 比 Web 服务慢。这是正确的吗?

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

最佳答案

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

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

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

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

  • 如果需要传输速度,您还可以使用网络套接字。但由于其资源占用,这不如选项 1。但如果您不担心的话,Websocket 是一种 super 酷的全双工通信方式。
  • 关于java - 向客户端广播消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38638398/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com