.net internet上基于客户端/服务器消息的体系结构 问题

.net internet上基于客户端/服务器消息的体系结构 问题,.net,architecture,messaging,.net,Architecture,Messaging,一段时间以来,我一直在思考基于消息的体系结构的复杂性,当消息传递的渠道之一包括互联网时 我很赞成在客户机上对消息进行排队的概念,当处理这些消息时,会导致通过internet进行web服务调用,然后在服务器上对这些消息进行排队,以便根据业务规则进行处理。我目前不知道的是一种机制,它可以将消息发送回客户机,告诉客户机发生了什么事情 榜样 在本例中,考虑一个桌面仓库管理应用程序,该应用程序希望从服务器接收消息,而不是轮询以查看是否有消息 例如 用户通过严格的SLA在网站上创建紧急订单,以便在几分钟内进

一段时间以来,我一直在思考基于消息的体系结构的复杂性,当消息传递的渠道之一包括互联网时

我很赞成在客户机上对消息进行排队的概念,当处理这些消息时,会导致通过internet进行web服务调用,然后在服务器上对这些消息进行排队,以便根据业务规则进行处理。我目前不知道的是一种机制,它可以将消息发送回客户机,告诉客户机发生了什么事情

榜样 在本例中,考虑一个桌面仓库管理应用程序,该应用程序希望从服务器接收消息,而不是轮询以查看是否有消息

例如

  • 用户通过严格的SLA在网站上创建紧急订单,以便在几分钟内进行拣选,因为有人已经在路上取货了
  • OrderCreated
    消息将在服务器上发布
  • Magic会将
    OrderCreated
    消息发送到仓库中PC上运行的客户端软件。
  • 客户机软件在屏幕上显示新的顺序(可能在重启等情况下缓存到磁盘)
  • 仓库团队挑选物品以完成订单
  • 以上第3点是我在寻找技术来填补这一空白

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


    非常感谢。

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

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

    我将使用使用TCP和回调的WCF服务


    你为什么说它不可伸缩?

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

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

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


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

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

    请看一看-它还没有出现,但它打算成为/long poll技术的继承者。它是为web浏览器而设计的,但没有理由不能在其他类型的客户端中使用。

    我想让客户端软件的每个实例都保持一个通过防火墙打开的到web服务器的永久套接字连接是不可取的。那么,这不太可能是个问题吗?我不能说你的防火墙会如何处理这个问题。查阅手册;)