我正在亚马逊(AWS)云中创建一个新的ASP MVC订单应用程序,并在我的本地数据中心使用持久层。我将使用CQRS模式。该项目的目标是使用Queue来存储和转发可在本地数据中心异步拾取和处理的写入(命令/事件)的高可用性。然后,如果WAN或我的本地数据中心发生故障,我的云MVC应用程序仍然可以接受命令并将它们排队,直到处理恢复为止。
我的第一个想法是使用AWS SQS进行排队,并在我自己的c#应用程序中创建自己的队列使用者/调度程序/处理程序来处理传入的消息/事件。
MVC(@ Amazon) - >事件/ POCO - > SQS - > QueueReader(@ my datacenter) - > DB
然后我找到了NServiceBus。 NSB似乎很好地处理了很多细节:消息处理,重试,错误处理等等。我讨厌重新发明轮子,NServiceBus似乎是一个功能齐全且成熟的产品,对我来说非常完美。
但是在进一步的研究中,它看起来并不像NServiceBus真正意味着在物理上分离的环境中使用WAN(云到我的数据中心)。谷歌和SO并没有真正描绘出在我需要的WAN上使用NServiceBus的好照片。
我可以这样做吗?
MVC(@ Amazon) - >事件/ POCO - >通过WAN的NServiceBus - > NServiceBus Handler(s) - > DB
如何在WAN上使用NServiceBus?或者是否有更好的解决方案来处理亚马逊和本地数据中心之间的排队和消息处理?
答案 0 :(得分:6)
使用SQS作为NServiceBus的传输是一种选择,但是您必须了解here所述的权衡。这已经通过Azure队列存储完成,但我不知道任何出色的SQS实现。
另一种选择是在数据中心和AWS VPC之间创建VPN。如果您在相应的安全组中打开相应的端口,这将允许AWS服务器与您的数据中心之间的直接MSMQ通信。这种方法有一些警告。首先,是关于端点名称。 NServiceBus 2.6及更低版本使用Environment.MachineName作为端点的名称,您必须为其设置正确的DNS。我相信以后的版本会使用机器的IP地址。也许更重要的一点是,VPN可以使您的系统更加耦合。
另一种方法是使用gateway的NServiceBus概念。但这应该是一个合乎逻辑的商业决策。网关与常规传输非常相似,但通常背后有不同的业务环境。
答案 1 :(得分:3)
NServiceBus包含一个Gateway组件,用于处理桥接物理上分离的数据中心。
http://docs.particular.net/nservicebus/gateway/
它基本上将消息传递到HTTP通道,并处理您通常使用Web服务时的重试逻辑和重复数据删除问题。
如果您下载完整的NServiceBus软件包(不只是通过NuGet包含它),那么您将看到一个充满示例的文件夹,其中一个文件涵盖了Gateway的使用情况,这是一个很好的入门方式。