NServiceBus 和 Rabbit MQ 或 Kafka

NServiceBus and Rabbit MQ or Kafka

我正在学习消息系统。我发现 RabbitMq 和 NServiceBus 在少数地方一起使用。我的问题是

  1. 如果我使用的是 RabbitMQ 那么我为什么需要 NServiceBus?反之亦然
  2. 有什么 NServiceBus 可以做而 RabbitMQ 或 Kafka 做不到的?
  3. 我可以同时使用NServiceBus和kafka吗?或者 Apache-Kafka 不需要 NServiceBus

多年前,我也问过自己同样的问题。我正在查看 NServiceBus 以使用不同的消息队列,但问题是一样的。

我决定不使用 NServiceBus。

6 个月后,我意识到我已经重新构建了 NServiceBus 所做的一半......只是更糟糕。

为什么你需要 NServiceBus 和 RabbitMQ 的等价问题是问为什么你需要 .NET Framework 和 ASP.NET MVC,或 WinForms,或 XAML,或任何当您拥有公共语言运行时时,.NET 附带的内置库。

毕竟 CLR 还不够吗?

当然不是。拥有可以执行代码的运行时 - MSIL 解释器和执行引擎 - 还不足以提高生产力。

当然,您可以编写接受输入并产生输出的命令行应用程序。但是尝试在没有公共库的情况下构建一个真正的应用程序——没有内置的 SQL 服务器驱动程序;没有任何第三方控件或库。构建一个没有 System.Windows 命名空间的 Windows 桌面应用程序。

您需要这些库来为您提供集合、数据库访问、window 对象和 UI 控件。

同样,RabbitMQ 为您提供了入门和工作所需的一切,但不足以维持生产力。

当然,您可以获取 RabbitMQ 的 .NET 驱动程序并开始生成和使用消息。

暂时,这会工作得很好。

很快,您就会发现自己围绕驱动程序创建了一个包装器,这样您就可以减少需要编写的代码量。

然后您会发现自己需要处理 ack 与 nack,您将为此创建一个简单的 API。

然后 nack 调用将弹出对死信队列的需求,您将把它包装在 API 中 - 当然,与 rabbitmq 驱动程序相比简化了。

最终,您需要处理有毒消息 - 格式错误并导致异常的消息。再一次,您不想为此编写一次性代码,因此您将编写一个库来处理它。

这样的例子不胜枚举。

6 个月后,您会发现自己使用的是一个写了一半、几乎没有指定、不可测试的库,它仅模仿 NServiceBus(或 MassTransit 或您选择的任何其他服务总线库)的价值和功能。

我不会说您必须使用 NServiceBus。我会说你应该学习 RabbitMQ 的工作原理,没有它。但是一旦您超越了发送和接收消息的基础知识,NServiceBus 和其他服务总线实现的价值就会变得非常明显、非常迅速。

现在 NServiceBus 中似乎有对 Kafka 传输的社区支持:https://docs.particular.net/nservicebus/kafka/ (我自己还没试过)。