Rebus 传输,MSMQ / SQL

Rebus transport, MSMQ / SQL

在Rebus 中发布时,如果MSMQ 不是运行 或MSMQ 服务中的某些其他错误,则会抛出异常。是否有内置解决方案(在 Rebus 中)在发布前检查?或者我必须使用 .Net 服务控制器?

关于使用SQLServer作为传输,在WAN中的性能和可靠性如何? Rebus 是怎么做到的?有没有示例代码之类的?

Transport(t => t.UseMsmq...)
Transport(t => t.UseSqlServer...)

While publishing in Rebus, if MSMQ is not running or some other errors in MSMQ service, it throws exception. Is there a built-in solution (in Rebus) to check before publishing? Or I must use .Net Service Controller?

如果我是你,我会简单地尝试 await bus.Send(..) 然后捕获它可能抛出的任何异常。这样,您将在处理的错误类型方面得到更好的覆盖,而且它避免了您可能会遇到的竞争条件(*)

对于在这种情况下捕获到异常时应该做什么,我没有一般性建议。

通常风险很低,因此实际上构建一种可以克服它的机制没有意义,因为您可能会将打算发送的消息的内容记录为 ERROR 而不是请人手动处理。

但有时构建某种 "local outbox" 或可用于临时存储无法发送的消息的东西可能是有意义的。但由于 MSMQ 是本地 运行 服务,您可以像监视所有其他 Windows 服务一样监视它,并且在与它通信时不涉及远程处理,您可以使它比几乎任何其他东西都更可靠.

About using SQLServer as transport, how is the performance and reliability in WAN? how does Rebus do it? Is there some sample code or something?

如果您的要求不高,使用SQL 服务器作为传输可以正常工作。 SQL 服务器并不是真正的消息队列,它不能很好地处理长队列(如 10s 或 100s 的数千条消息),因为队列长度会影响接收性能。

此外,它会要求您在发送和接收消息时进行远程处理,所以我的猜测是您在发送时很难让它像 MSMQ 一样可靠(这无关紧要接收时很多,因为端点会在中断后再次恢复连接时简单地恢复——但是当你第一次发送时,可能是在网络请求中,你真的希望传输能够处理消息)。

the samples repository, and the Rebus.SqlServer repository has a couple of tests that might be interesting to look at if you want to use SQL Server for everything. E.g. the TestSqlAllTheWay 中有一堆样本 IMO 测试很有趣 :)


(*) 如果您这样做:

  1. 检查MSMQ是否存在
  2. 发送

如果 MSMQ stopped/broke/whatever 正好在 1 和 2 之间,您无论如何都会得到一个例外。