在Rebus中发布时,如果MSMQ未运行或MSMQ服务中存在其他错误,则抛出异常。在发布前是否有内置的解决方案(在Rebus中)进行检查?或者我必须使用。net服务控制器?
关于使用SQLServer作为传输,在广域网中性能和可靠性如何?雷布斯是怎么做到的?有一些示例代码之类的吗?
Transport(t => t.UseMsmq...)
Transport(t => t.UseSqlServer...)
在Rebus中发布时,如果MSMQ未运行或MSMQ服务中存在其他错误,则抛出异常。在发布前是否有内置的解决方案(在Rebus中)进行检查?或者我必须使用。net服务控制器?
如果我是你,我会简单地尝试await bus.Send(..)
,然后捕获可能由此抛出的任何异常。这样,您就可以更好地了解所处理的错误类型,并且它避免了您可能遇到的竞争条件(*)
通常风险是足够低的,实际上没有意义建立一个机制来克服它,因为你可能会侥幸通过记录你打算发送的消息的内容作为一个错误,然后让别人手动处理它。
但有时建立某种"本地发件箱"或可用于临时存储无法发送的消息的东西可能是有意义的。但是,由于MSMQ是一个本地运行的服务,您可以像监视所有其他Windows服务一样监视它,并且在与它通信时不涉及远程,因此您可以使它比几乎任何其他服务都更可靠。
关于使用SQLServer作为传输,在广域网中性能和可靠性如何?雷布斯是怎么做到的?有一些示例代码之类的吗?
使用SQL Server作为传输可以工作,如果你的要求是适度的。SQL Server并不是一个真正的消息队列,而且它不能很好地处理长队列(如成千上万条消息),因为队列长度会影响接收性能。
此外,它需要你做远程,当你发送和接收消息,所以我的猜测是,你将很难使它尽可能可靠MSMQ当你发送(没关系,当收到,因为端点会恢复当连接恢复后再停机,但是当你第一次发送,可能在web请求,你真正想要的交通能够照顾消息)。
在样本存储库中有一堆样本,Rebus.SqlServer
存储库中有几个测试,如果你想使用SQL Server做任何事情,可能会很有趣。例如,TestSqlAllTheWay
测试是有趣的IMO:)
(*)如果你这样做了:
- 检查MSMQ是否存在
如果MSMQ在1和2之间停止了/中断了/无论如何你都会得到一个异常