服务器推送与客户端拉取代理服务器拓扑

我需要创建一个包含2个组件的系统:

  • 处理和存储数据的单个服务器。 它还定期向代理发送更新

  • 安装在远程端点的多个代理程序。 这些数据收集(通常但不总是)长时间运行的数据,这些数据需要到达服务器

我正在使用C#.NET,理想情况下我想使用符合标准的通信方法(即可以与Java合作的方法,因为我们将来也可能使用Java代理)。 有没有Web服务的替代品? 我有什么选择?

我看到它的方式我有3个选项使用Web服务,并做了以下观察:

  • 客户拉
    • 代理不需要开放端口,因为它像客户端一样
    • 需要轮询服务器以获取更新
  • 服务器推送
    • 在代理程序中打开端口,因为它充当服务器
    • 服务器必须轮询代理以获取结果
  • 混合动力
    • 在代理程序中打开端口,因为它的作用类似于客户端和服务器
    • 没有民意调查; 服务器在需要时推送更新,客户端在可用时发送结果

“混合”(代理商既是客户端又是服务器)似乎是明显的选择 – 但这个应用程序通常会安装在企业和政府环境中,我担心他们可能会遇到在代理商处打开端口的问题。我是住在这上面太多了?

我错过了其他任何利弊吗?

我们的朋友在http://www.infrastructures.org发誓基于拉动机制: http : //www.infrastructures.org/papers/bootstrap/bootstrap.html

他们更喜欢客户端拉过服务器推送的一个主要原因是客户端可能已关闭,客户端必须(通常)应用服务器推送的所有操作。 如果这个标准在你的情况下并不重要,也许他们的结论不会是你的结论,但我认为值得阅读他们论文中的“Push vs Pull”部分来自行确定。

我想说,在这个时代,你可以认真考虑只拉动技术。 推送的问题在于客户端通常隐藏在网络地址遍历设备(NAT)之后,如无线路由器,宽带调制解调器或公司防火墙,并且它们通常无法从服务器访问。

即使在大多数受限制的网络中,特别是在HTTP / HTTPS等众所周知的端口上进行出站连接(’phone-home’)基本上也可以被认为是“可能的”。

如果您使用某种消息服务器(JMS for Java,不确定C#),那么您的消息服务器是唯一需要打开端口的服务器,您可以从代理到消息服务器和服务器进行双向通信到消息服务器。 这将允许您完成混合模型,而无需在代理服务器上打开端口。

恕我直言,我发现你最好的选择是拉动选项..它可以满足你的主要系统要求如下:

第一部分:数据需要到达服务器,显然可以通过调用将该数据作为参数发送的Web方法来完成

第二部分:(服务器周期性地向代理发送更新):你仍然可以通过客户端(常规)通过某种“请求”自上次拉动后“请求”更新的Web服务方法来实现这一点(某些类型的s)得到错过的更新的时间戳)

混合方法对我来说似乎有点奇怪,因为我认为代理作为系统的一部分可能会经常“脱机”,如果失败,服务器会怎么做? 这通常是一个棘手的问题/决定,特别是如果您不确定这是否意图“脱机”或系统/网络故障等等