我正试图学习消息系统。我发现 RabbitMQ 和 NServiceBus 有时会一起使用。我的问题是:
- 如果我正在使用 RabbitMQ,那么我为什么需要 NServiceBus?反之亦然。
- NServiceBus 能做什么,但 RabbitMQ 或 Kafka 无法做到?
- 我能同时使用 NServiceBus 和 Kafka 吗?或者 Apache-Kafka 不需要 NServiceBus?
我正试图学习消息系统。我发现 RabbitMQ 和 NServiceBus 有时会一起使用。我的问题是:
多年前,我曾问过自己同样的问题。我正在考虑使用 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和其他服务总线实现的价值会非常明显,非常快速。
看起来现在NServiceBus已经支持Kafka传输了:https://docs.particular.net/nservicebus/kafka/(我自己还没有尝试过)。