基于客户端/服务器消息的互联网架构

时间:2011-03-23 12:30:38

标签: .net architecture messaging

问题

我一直在思考基于消息的架构的复杂性,当其中一个消息传递渠道包括互联网时。

我对在客户端上排队消息的概念很好,这些消息在处理时会导致通过互联网进行的Web服务调用,然后在服务器上对这些相同的消息进行排队,以便根据业务规则进行处理。我目前不知道的是一种向客户端发送消息返回的机制,告诉它发生了什么事。

示例

在此示例中考虑一个桌面仓库管理应用程序,它希望从服务器接收消息,而不是轮询以查看是否有任何消息。

E.g。

  1. 用户在具有严格SLA的网站上创建紧急订单,以便在几分钟内进行拣选,因为有人已经开始收集该项目。
  2. OrderCreated消息发布在服务器上。
  3. Magic恰好将OrderCreated消息发送到仓库中PC上运行的客户端软件。
  4. 客户端软件在屏幕上显示新订单(如果重新启动等,可能会缓存到磁盘)。
  5. 仓库团队挑选物品以完成订单。
  6. 上面的第3点我正在寻找填补空白的技术。

    一些可能的解决方案

    1. 定期并经常(小时)轮询服务器以查看是否有消息,并将其下载到本地队列进行处理。
    2. 在WCF中使用类似双向通信的东西,虽然这需要在客户端和服务器之间永久保持通道/套接字/端口等,因此它不会优雅地扩展。
    3. 实际上在本地站点中打开端口并配置端口转发和防火墙等,以启用MSMQ(或其他一些技术,如WCF,这可能意味着在客户端硬件上托管IIS或类似功能)将消息推送到客户端。当然,这里的部署和支持成本是天文数字。
    4. 有没有人有过使用此处未列出的解决方案实现此目标的经验?我不是一定要寻找细节,我只是在这个空间里四处寻找,看看它是如何完成的。

      非常感谢提前。

6 个答案:

答案 0 :(得分:1)

我在自动化领域有很多经验,我会说轮询和双向通信是最常见的。

在这两者中,我总是喜欢双向通信。它确实可以很好地扩展到某一点 - 只要服务器使用异步API(并且特别是使用“每个连接一个线程”),就可能有数万个套接字/ WCF连接。设计憎恶)。

轮询方法会产生更多不必要的网络流量,但如果您通过单个服务器进行扩展,可能会更好。在我看来,您可以使用现有技术相当容易地扩展到Web场,如果您使用轮询方法,这种扩展(我认为)会更容易。不过,我从来没有必须扩大规模。

我没有将MSMQ用于此类通信,但使用了IBM的WebSphere(类似技术)。消息队列有自己的一系列自动化问题,例如处理死信队列等。如果您希望服务器关闭一段时间(或者如果您在客户端和服务器之间有不可靠的“中间件”),这将非常有用),但一般来说,我更喜欢通过套接字或WCF进行双向通信。

答案 1 :(得分:0)

也许在JMS之后构建一些东西(或者甚至只是为现有的.net服务器构建一个JMS适配器,然后直接使用JMS)?在中,您可以让客户端维护与通知服务器的持久套接字连接(如果您正在考虑每分钟多次轮询服务器,那么为什么不保持套接字打开?)。当建立套接字时,连接客户端可以订阅/注册它有兴趣接收的任何事件(例如“我只想要与仓库A中的产品相关联的事件”)。然后,当在服务器上发布OrderCreated消息时,服务器可以查看其客户端列表以查看谁为该消息注册,并立即通过相应的套接字连接向客户端发布通知。

答案 2 :(得分:0)

Here是我之前使用(3或4年前)创建即时消息程序的简短代码段。它创建一个TcpListener可以接受来自服务器的消息,NetworkStreamTcpClient可以向服务器发送消息。这可能不是一个完整的答案,但它可能有助于指导你。

答案 3 :(得分:0)

我会使用TCP和回调来使用WCF服务。

是什么让你说它不能扩展?

答案 4 :(得分:0)

我目前正致力于一些非常相似的事情,其中​​消息需要通过互联网及时传递到DSL路由器/调制解调器后面的客户端软件,并且可能绑定到动态IP地址。频繁的轮询是我们选择的解决方案,在性能和简单性之间取得平衡。

答案 5 :(得分:0)

看一下WebSockets - 它还没有,但它的目的是成为Comet / long-poll技术的继承者。它旨在实现Web浏览器,但没有理由不能在其他类型的客户端中使用。