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

时间:2010-08-04 02:06:04

标签: c# .net architecture networking

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

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

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

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

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

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

'hybrid'(代理商都是客户端服务器似乎是显而易见的选择 - 但这个应用程序通常会安装在企业和政府环境中,我担心他们可能会遇到问题在代理商处开了一个港口。我是否过多地关注这个?

我错过了其他任何优点和缺点吗?

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

特别是在HTTP / HTTPS这样的知名端口上进行出站连接('phone-home')基本上可以假设为“可能”,即使在大多数限制网络下也是如此。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

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

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