使用NServiceBus + RabbitMQ对纯RabbitMQ有什么好处?

时间:2017-11-01 17:53:36

标签: rabbitmq nservicebus

使用NServiceBus + RabbitMQ对纯RabbitMQ有什么好处? 我想它提供了额外的基础设施。还有什么呢?

2 个答案:

答案 0 :(得分:21)

你绝对可以使用纯RabbitMQ。你只需记住几件事。

警告:这个答案将有点 非常诙谐。

首先,您应该阅读Enterprise Integration Patterns封面,以确保您理解它。这是736页,有点干,但非常有用的信息。成为RabbitMQ所有特性的专家也不会有什么坏处。

然后,您只需要决定define messages的方式,define message handlers的方法,send messagespublish events的方法。在你走得太远之前,你会想要一个好的logging infrastructure。您需要为message serializer创建message routing和基础架构。您需要在每个业务消息的内容中包含一堆与基础架构相关的元数据。您将需要构建一个消息出列策略,该策略运行良好并有效地使用代理连接,同时考虑到并发需求。

接下来,您需要了解如何retry messages automatically when the handling logic fails,而不是太多次。您必须有一个处理有害消息的策略,因此您需要将它们移到一边,这样您的处理逻辑就不会被阻塞,从而阻止处理有效的消息。您需要一种方法show those messages that have failed and figure out why,以便解决问题。你需要某种alerting options所以你知道什么时候发生。如果该毒药消息显示还显示了该消息的来源以及异常是什么,那么您不需要去挖掘日志文件,这将是很好的。之后,您需要能够reroute the poison messages back into the queue to try again。如果部署不当,您可能会收到大量失败的消息,因此如果您不必一次重试一条消息,那将非常好。

由于您正在使用RabbitMQ,因此消息代理上没有事务,因此ghost消息和重复实体是非常实际的问题。您需要将所有消息处理逻辑编码为幂等,或者您的RabbitMQ消息和数据库实体将开始变得不一致。或者,您可以design infrastructure to mimic distributed transactions将传出的消息传递操作存储在业务数据库中,然后单独执行消息调度操作。这会导致重复的消息(按设计),因此您需要在消息进入时对其进行重复数据删除,这意味着您需要在整个系统中定义明确的strategy for consistent message IDs消息。要小心,因为处理事务和并发的任何事情都非常棘手。

您可能想要做一些workflow type stuff,其中传入的消息启动一个基本上是消息驱动的状态机的进程。然后,您可以执行一些事情,例如在收到2条所需消息后触发操作。您需要为该数据设计存储系统。您可能还需要一种延迟消息的方法,因此您可以执行buyer's remorse pattern之类的操作。 RabbitMQ无法对邮件进行任意延迟,因此您必须come up with a way to implement that

您可能希望此系统上的某些metricsperformance counters知道它的执行情况。您需要某种方式才能have tests on your message handling logic,所以如果您需要换出一些依赖项来完成这项工作,您可能需要integrate a dependency injection framework

由于这些系统本质上是分散的,因此很难准确地描绘出系统的外观。如果您send a copy of every message to a central location,您可以write some code将所有消息对话拼接在一起,然后您可以使用该数据构建消息流图,序列图等。这种基于实时数据的生动文档对于向管理者解释事情或弄清楚流程为何没有按预期发挥作用至关重要。

说到文档,请确保write a whole lot of it为您的消息队列包装器,否则其他开发人员很难帮助您维护它。如果你团队中的其他人正在编写它,那么当他们找到不同的工作离开公司时,你会完全被搞砸了。您还需要在您构建的RabbitMQ包装器上进行大量的单元测试。像这样的基础设施代码应该是坚如磐石的。您不希望丢失消息导致销售损失或类似的事情。

因此,如果你记住这些事情,你可以完全使用没有NServiceBus的纯RabbitMQ。

希望当你完成后,你的老板不会决定你需要从RabbitMQ切换到Azure Service BusAmazon SQS

答案 1 :(得分:8)

我会尝试并提出要点:

  • NServiceBus处理与其底层传输的所有通信,即Rabbit
  • NServiceBus有一个干净的API来编写您的业务逻辑。
  • 如果您想获得一些自定义行为,NServiceBus很容易扩展。
  • NServiceBus处理fault tolerance
  • 的所有方面
  • NServiceBus有许多功能,如:

Sagas (long running process management)

Outbox (reliability with non DTC transports)

The Particular Platform for monitoringdebugging and visualizing

这会回答你的问题吗?