我一直在思考基于消息的架构的复杂性,当其中一个消息传递渠道包括互联网时。
我对在客户端上排队消息的概念很好,这些消息在处理时会导致通过互联网进行的Web服务调用,然后在服务器上对这些相同的消息进行排队,以便根据业务规则进行处理。我目前不知道的是一种向客户端发送消息返回的机制,告诉它发生了什么事。
在此示例中考虑一个桌面仓库管理应用程序,它希望从服务器接收消息,而不是轮询以查看是否有任何消息。
E.g。
OrderCreated
消息发布在服务器上。OrderCreated
消息发送到仓库中PC上运行的客户端软件。 上面的第3点我正在寻找填补空白的技术。
有没有人有过使用此处未列出的解决方案实现此目标的经验?我不是一定要寻找细节,我只是在这个空间里四处寻找,看看它是如何完成的。
非常感谢提前。
答案 0 :(得分:1)
我在自动化领域有很多经验,我会说轮询和双向通信是最常见的。
在这两者中,我总是喜欢双向通信。它确实可以很好地扩展到某一点 - 只要服务器使用异步API(并且特别是不使用“每个连接一个线程”),就可能有数万个套接字/ WCF连接。设计憎恶)。
轮询方法会产生更多不必要的网络流量,但如果您通过单个服务器进行扩展,可能会更好。在我看来,您可以使用现有技术相当容易地扩展到Web场,如果您使用轮询方法,这种扩展(我认为)会更容易。不过,我从来没有必须扩大规模。
我没有将MSMQ用于此类通信,但使用了IBM的WebSphere(类似技术)。消息队列有自己的一系列自动化问题,例如处理死信队列等。如果您希望服务器关闭一段时间(或者如果您在客户端和服务器之间有不可靠的“中间件”),这将非常有用),但一般来说,我更喜欢通过套接字或WCF进行双向通信。
答案 1 :(得分:0)
也许在JMS之后构建一些东西(或者甚至只是为现有的.net服务器构建一个JMS适配器,然后直接使用JMS)?在中,您可以让客户端维护与通知服务器的持久套接字连接(如果您正在考虑每分钟多次轮询服务器,那么为什么不保持套接字打开?)。当建立套接字时,连接客户端可以订阅/注册它有兴趣接收的任何事件(例如“我只想要与仓库A中的产品相关联的事件”)。然后,当在服务器上发布OrderCreated
消息时,服务器可以查看其客户端列表以查看谁为该消息注册,并立即通过相应的套接字连接向客户端发布通知。
答案 2 :(得分:0)
Here是我之前使用(3或4年前)创建即时消息程序的简短代码段。它创建一个TcpListener
可以接受来自服务器的消息,NetworkStream
和TcpClient
可以向服务器发送消息。这可能不是一个完整的答案,但它可能有助于指导你。
答案 3 :(得分:0)
我会使用TCP和回调来使用WCF服务。
是什么让你说它不能扩展?
答案 4 :(得分:0)
我目前正致力于一些非常相似的事情,其中消息需要通过互联网及时传递到DSL路由器/调制解调器后面的客户端软件,并且可能绑定到动态IP地址。频繁的轮询是我们选择的解决方案,在性能和简单性之间取得平衡。
答案 5 :(得分:0)
看一下WebSockets - 它还没有,但它的目的是成为Comet / long-poll技术的继承者。它旨在实现Web浏览器,但没有理由不能在其他类型的客户端中使用。