java - 如何确认推送网络服务

标签 java web-services architecture

我的服务器上有一个网络服务,可以将 xml 数据推送到通过 Internet 与之通信的客户端。

  1. 在这些情况下,我们很难获得来自 客户。
  2. 具体情况如,一旦客户端收到数据之前 如果通信 channel 出现故障,则发送确认。

    例子: 如果通过互联网在客户端上进行软件更新,服务器如何确保一切都处理得很好。

最佳答案

如果您想继续“推送”路径,并且您绝对必须知道更新是否成功,那么您必须以您知道的方式构建您的服务和客户端。

基本上,您需要做的是构建一个小型协议(protocol),以便无论通信信道出现故障如何都可以传输信息。这意味着两件事:

  • 您的服务会重新传输;
  • 您的客户可以处理重复的消息;

例如:

  1. 服务推送消息,客户端确认 => 一切正常;

  2. 服务推送消息,连接断开,消息丢失。客户端不确认,因为它从未收到消息 => 服务在稍后的某个时间再次推送相同的消息。现在希望您能了解案例 1。

  3. 服务推送消息,客户端确认但连接失败,服务未收到确认 => 类似于 2,因此服务稍后再次推送相同的消息,现在客户端收到相同的消息消息两次。它必须忽略第二条消息,但仍需要发送确认,这样服务就不会第三次、第四次、……第 n 次发送它;

等等……

这是对 TCP 的高级描述做,例如。 TCP 是不可靠网络上的可靠协议(protocol)。它处理丢弃的数据包、重复的数据包等。

现在,那将是插入。一个更简单的替代方法是改用“拉”。客户端定期从服务器拉取更新。这实现起来更简单(如果下载成功则下载成功,否则您稍后再试)但它并非没有陷阱,例如:

  • 控制客户端何时开始从服务中提取数据。您不能让它们全部同时更新,否则您可能会使服务器过载。客户端应该先询问服务器是否可以现在更新或稍后在服务不忙时再回来;
  • 您是否在后台从用户设备下载升级?可能会收取数据费用,因此最好询问用户是现在还是以后要更新,而不是在幕后进行更新;
  • 在后台更新,即使数据费用没有问题,当客户需要带宽用于其他用途时,仍可能会消耗带宽;

等等……

问题是这是一个很大的话题,其中包含可能不适用于特定情况的通用解决方案。但这不是一个新话题。其他人以前也遇到过这些问题。例如,考虑 Windows 更新,每台 PC 的操作系统如何 self 更新。不久前,当胖客户端需要更新时,发生了类似的事情。世界转向瘦客户端,但现在胖客户端正在卷土重来。看看这些问题是如何解决的,你会在网上找到有用的信息。

关于java - 如何确认推送网络服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37292734/

相关文章:

java - 如何更改 ActionListener 的聚焦 JButton 的默认键绑定(bind)?

java - 队列上 IBM MQ 的 IsOpen 和 OpenStatus 属性有何区别?

java - 将字符串转换为日期 WebService 时出错

.net - 从 Javascript 调用 Web 服务 - 它在幕后做了什么?

asp.net - 从 Azure 连接到 HTTPS Web 服务

java - 是否使用后端 Web 服务

docker - 如何容器化依赖数据库的服务?

java - 错误的资源泄漏警告?

web-services - 建立一个大规模的网络服务

java - jTextField 验证弹出窗口