当然,你可以用拉比


注:本文改编自answer I originally posted to a Stack Overflow question

人们(经常)问为什么他们需要服务总线。他们可能会说:“我有RabbitMQ,它有内置的酒吧/酒馆。”“网络服务总线不就是拉比的包装吗?我可能会在不到一个周末的时间里写完。毕竟,有多难?

当然,你绝对可以只使用纯拉比Qq。我甚至会帮你开始写包装。你只需要记住几件事。

首先,你应该阅读Enterprise Integration Patterns从头到尾,确保你很好地理解它。它有736页,有点枯燥,但却是非常有用的信息。成为所有拉比特质的专家也没什么坏处。

那你只需要决定如何define messages,如何define message handlers,如何send messages,以及publish 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,所以消息代理上没有事务,所以虚消息和重复实体是非常现实的问题。您将需要对所有消息处理逻辑进行编码,并牢记幂等性,否则您的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包装进行大量的单元测试。像这样的基础设施代码应该坚如磐石。你不希望丢失一条信息导致销售损失或类似的事情。

因此,如果你记住这几件事,你完全可以使用纯RabbitMQ,而不使用NServiceBus。

希望当你完成后,你的老板不会决定你需要换工作RabbitMQAzure Service Bus或者Amazon SQS