2010-12-19 100 views
0

所有与WCF断开的消息,建议通过防火墙

我要找的建议在以下情形:

我在将消息发送给应用程序的企业网络的一部分运行的组件逻辑组件进行处理。这些组件可能驻留在同一台服务器上,同一网络中的不同服务器上(LAN或WAN),或者驻留在云端。应用程序服务器应该具有可伸缩性和弹性。

这些消息是相关的,因为它们到达的顺序很重要。它们用客户时间戳标记时间。我认为我会让客户端使用WCF basicHttpBinding(有些基于.NET CF只有基本的)来发送消息到应用服务器(这是因为我们可以保证端口80/443将对外发连接开放)。服务器接受这些,并将它们写入队列。如果需要通过多台机器,该队列可以扩展。

我对使用MSMQ的队列犹豫不决,为了正确扩展,我们将不得不在每个应用程序服务器上安装单独的专用队列,并循环监控队列。我担心,尽管我们可能会在服务器恢复之前丢失一个服务器上的消息,并且我们最终可能会处理来自其他服务器的稍后消息并破坏顺序。

我更喜欢所有应用程序服务器监视的中央队列(例如数据库表)。

考虑到这一点,我想要做的是创建一个自定义WCF绑定,类似于netMsmqBinding,但它使用数据库表,而我很困惑我是否可以简单地创建一个自定义传输或者我需要一个完整的绑定,以及绑定是否允许客户端通过HTTP发送。我浏览过互联网,但对于从哪里开始我有点困惑。

我不能打扰自定义WCF绑定,但它似乎是一个很好的方式来引入可伸缩性,如果我确实需要分离服务器。

任何建议,请有帮助,包括替代品。 非常感谢

+0

10个问题,不接受?不值得回答... – Aliostad 2010-12-19 17:32:22

+0

9个问​​题,实际上只有5个答案,其中只有一对夫妇帮助,但感谢您的评论。我会确保我更新那些我相信帮助过我的回复。 – GrahamB 2010-12-21 18:55:41

回答

0

我会从MSMQ开始,因为它正是为了这个purpouse。在群集计算机上使用单个事务队列,并让应用程序服务器从该队列获取消息进行处理。每个消息处理都必须是分布式事务(MSDTC)的一部分。

此方案将确保:

  • 群集队列主机将确保如果一个集群节点发生故障,其它仍然能够处理请求

  • 或者发送消息至可收回 - 这意味着,消息将会保留在硬盘上(不仅在内存中),所以在整个群集的严重故障中,您仍然会收到所有消息。

  • 事务性队列将确保所有消息传输操作都是原子性的 - 从传出队列到目标队列的移动消息将作为事务进行处理。这意味着来自外出队列的原始消息将保持在队列中,直到来自目标队列的消息到达。交易处理可以确保订单交付。

  • 分布式事务将允许应用程序服务器在事务中使用消息。消息不会从队列中删除,直到应用程序服务器提交事务或事务超时。

  • 也可以在.NET CF上使用MSMQ,因此您可以将消息直接发送到队列,而无需中间不可靠的Web服务层。

  • 应该可以通过HTTP配置MSMQ(但我从来没有使用它,所以我不知道它如何与前面提到的功能合作)。

您提出的解决方案将非常困难。您将最终构建BizTalk的MessageBox。但是如果你真的想这样做,请检查Omar's post关于构建数据库队列表。

+0

感谢您的反馈,尤其是帖子,但我必须考虑这一点。该解决方案当然有弹性,但不具备可扩展性。根据我的理解,只能有一台服务器处理队列。 – GrahamB 2010-12-21 18:59:56

+0

不可以有尽可能多的服务器进行处理,但只有一个服务器/集群托管队列(队列不必位于处理服务器上)。但是,如果消息顺序非常重要,那么您永远不会拥有可扩展的解决方案,因为您将始终只有单个服务器处理消息。在成功处理当前消息之前,没有人能够接收其他消息。否则,处理失败将破坏序列。 – 2010-12-22 11:51:55

+0

好的谢谢。总是有这样的印象,私人MSMQ队列不能/不应该在计算机之间共享,但只是回顾一下,在Win2008中似乎有所改进。它肯定会让事情变得更容易:) – GrahamB 2010-12-24 13:54:08