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

Voi*_*miX 8 nservicebus rabbitmq

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

Dav*_*ike 25

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

警告:这个答案会有点 极端舌头在脸颊.

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

然后,您只需决定如何定义消息,如何定义消息处理程序,如何发送消息以及发布事件.在你走得太远之前,你会想要一个好的日志记录基础设施.您需要为邮件路由创建消息序列化程序和基础结构.您需要在每个业务消息的内容中包含一堆与基础架构相关的元数据.您将需要构建一个消息出列策略,该策略运行良好并有效地使用代理连接,同时考虑到并发需求.

接下来,您需要弄清楚当处理逻辑失败时如何自动重试消息,但不要多次.您必须有一个处理有害消息的策略,因此您需要将它们移到一边,这样您的处理逻辑就不会被阻塞,从而阻止处理有效的消息.您需要一种方法来显示那些失败的消息并弄清楚原因,以便您可以解决问题.您需要某种警报选项,以便在发生这种情况时知道.如果该毒药消息显示还显示了该消息的来源以及异常是什么,那么您不需要去挖掘日志文件,这将是很好的.之后,您需要能够将有毒消息重新路由回队列中再次尝试.如果部署不当,您可能会收到大量失败的消息,因此如果您不必一次重试一条消息,那将非常好.

由于您使用的是RabbitMQ,因此消息代理上没有事务,因此ghost消息和重复实体是非常实际的问题.您需要将所有消息处理逻辑编码为幂等,或者您的RabbitMQ消息和数据库实体将开始变得不一致.或者,您可以通过在业务数据库中存储传出消息传递操作,然后单独执行消息调度操作来设计基础架构以模拟分布式事务.这会导致重复的消息(设计),所以你需要重复数据删除的消息,因为他们进来,这意味着你需要一个良好定义良好的一致的消息ID策略,整个系统中.要小心,因为处理事务和并发的任何事情都非常棘手.

您可能想要做一些工作流类型的东西,其中传入的消息启动一个基本上是消息驱动的状态机的进程.然后,您可以执行一些操作,例如在收到2条所需消息后触发操作.您需要为该数据设计存储系统.你可能还需要一种方法来延迟消息,这样你就可以做买家的悔恨模式.RabbitMQ无法对消息进行任意延迟,因此您必须想出一种方法来实现它.

您可能希望此系统上的某些指标性能计数器知道它的执行情况.您需要一些方法来对消息处理逻辑进行测试,因此如果您需要交换一些依赖项来实现这项工作,您可能需要集成一个依赖注入框架.

由于这些系统本质上是分散的,因此很难准确地描绘出系统的外观.如果您将每条消息的副本发送到中心位置,您可以编写一些代码将所有消息对话拼接在一起,然后您可以使用该数据构建消息流图,序列图等.这种生活文档基于实时数据对于向管理者解释事物或弄清楚流程为何没有按预期工作至关重要.

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

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

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


Sea*_*mar 10

我会尝试放下要点:

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

Sagas(长期运行流程管理),

发件箱(非DTC传输的可靠性)

用于监视,调试和可视化的特定平台

这回答了你的问题了吗?