在Rebus中发布时,如果MSMQ没有运行或MSMQ服务中的其他错误,则会引发异常。在发布之前,是否有一个内置解决方案(在Rebus中)可以检查?还是我必须使用.Net服务控制器?
关于使用SQLServer作为传输,广域网的性能和可靠性如何?雷布斯是怎么做到的?有什么样本代码吗?
Transport(t => t.UseMsmq...)
Transport(t => t.UseSqlServer...)发布于 2016-11-16 10:05:54
在Rebus中发布时,如果MSMQ没有运行或MSMQ服务中的其他错误,则会引发异常。在发布之前,是否有一个内置解决方案(在Rebus中)可以检查?还是我必须使用.Net服务控制器?
如果我是您,我只需尝试await bus.Send(..),然后捕获任何可能被抛出的异常。这样,您将在处理错误的类型方面得到更好的处理,而且它还避免了否则会遇到的竞争条件(*)。
对于在这种情况下遇到异常时,我没有一般性的建议。
通常情况下,风险很低,因此实际上构建一种能够克服它的机制是没有意义的,因为您可能会将您打算发送的消息的内容记录为错误,而不是让人手动处理。
但有时,构建某种“本地发件箱”或可用于临时存储无法发送的消息的东西可能是有意义的。但是,由于MSMQ是一个本地运行的服务,您可以像监视所有其他Windows服务一样监视它,并且在与它通信时不涉及远程处理,因此可以使它比任何其他服务都更可靠。
关于使用SQLServer作为传输,广域网的性能和可靠性如何?雷布斯是怎么做到的?有什么样本代码吗?
如果您的需求不大,使用Server作为传输可以正常工作。SQL Server并不是真正的消息队列,它不能很好地处理长队列(如10或1000条消息),因为队列长度会影响接收性能。
此外,它将要求您在发送和接收消息时进行远程处理,因此我的猜测是,当您发送消息时,您将很难使其与MSMQ一样可靠(接收时并不那么重要,因为当一个连接在中断后再次恢复时,端点将简单地恢复--但是当您第一次发送时(可能是在web请求中),您真的希望传输能够处理该消息)。
样本储存库中有很多示例,如果您想在所有方面都使用Server,那么存储库有几个测试可能会很有趣。例如,TestSqlAllTheWay测试很有趣,IMO :)
(*)如果你这样做:
如果MSMQ停止/中断/任何介于1到2之间的权限,您将得到一个异常。
https://stackoverflow.com/questions/40628008
复制相似问题