几年前,我问过自己同样的问题。我正在寻找 NServiceBus 来处理不同的消息队列,但问题是一样的。
我决定不使用 NServiceBus。
6 个月后,我意识到我已经重新构建了 NServiceBus 所做的一半......只是更糟糕。
你为什么需要带有 RabbitMQ 的 NServiceBus 的等效问题是问你为什么需要带有 ASP.NET MVC、WinForms、XAML 或任何 .NET 附带的内置库的 .NET Framework与,当你有公共语言运行时。
毕竟,CLR 还不够吗?
当然不是。拥有可以执行代码的运行时——MSIL 解释器和执行引擎——还不足以提高生产力。
当然,您可以编写接受输入并产生输出的命令行应用程序。但是尝试在没有公共库的情况下构建一个真正的应用程序——没有内置的 SQL Server 驱动程序;没有任何第三方控件或库。构建没有 System.Windows 命名空间的 Windows 桌面应用程序。
您需要这些库来为您提供集合、数据库访问、窗口对象和 UI 控件。
同样,RabbitMQ 为您提供了开始和工作所需的一切,但不足以维持生产力。
当然,您可以获取 RabbitMQ 的 .NET 驱动程序并开始生成和使用消息。
有一段时间,这会工作得很好。
很快,您会发现自己在驱动程序周围创建了一个包装器,这样您就可以减少需要编写的代码量。
然后您会发现自己需要处理 ack 与 nack,您将为此创建一个简单的 API。
然后,nack 调用会弹出对死信队列的需求,您将把它封装在您的 API 中 - 当然,与 rabbitmq 驱动程序相比,它会简化。
最终,您需要处理有害消息 - 格式错误并导致异常的消息。再一次,您不想为此编写一次性代码,因此您将编写一个库来处理它。
名单还在继续。
从现在起 6 个月后,您会发现自己正在使用一个只写了一半、几乎没有指定、无法测试的库,它只模仿 NServiceBus(或 MassTransit 或您选择的任何其他服务总线库)的价值和功能。
我不会说你必须使用 NServiceBus。我会说你应该学习 RabbitMQ 是如何工作的,没有它。但是,一旦您超越了发送和接收消息的基础知识,NServiceBus 和其他服务总线实现的价值就会变得非常明显,非常迅速。