MassTransmit/RabbitMQ 同一台机器上的多个不同实例

MassTransmit/RabbitMQ multiple distinct instances on the same machine

我想知道是否可以在同一台服务器上 运行 多个 MassTransmit 或 RabbitMQ 实例。基本上我们有一个在 RabbitMQ 之上使用 MassTransmit 的 .net 应用程序。不幸的是,我们的许多客户 运行 都在同一台服务器上同时使用实时和测试环境,因此为了部署到现实世界,我们需要一种方法来拥有多个实例或能够在实时和测试之间隔离消息。

我的一些想法 1) 做类似的事情:https://lazareski.com/multiple-rabbitmq-instances-on-1-machine/ 这里的问题是它依赖于客户端站点上的大量配置。

2) 我可以在所有消息中包含一个 header,每个消费者在使用消息之前检查是否存在正确的 header(例如 header 有 'live' 或 'test'。)显然,这意味着从所有实例接收到所有消息,无论它们是否适合它们,这远非理想。

理想情况下,我希望能够在客户端站点上以最少的设置做一些事情,例如每个环境的虚拟子实例或目录。

有两种方法可以解决此问题。

第一种方式最明显 - 您需要使用虚拟主机。

来自documentation

Virtual hosts provide logical grouping and separation of resources. Separation of physical resources is not a goal of virtual hosts and should be considered an implementation detail.

在您的 RMQ 实例中创建两个虚拟主机,称为 testprod,您在 MassTransit 端唯一需要做的就是更改 RMQ 连接字符串:

Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    cfg.Host(new Uri("rabbitmq://localhost/test"), host =>
    {
        host.Username("username");
        host.Password("password");
    });
}); 

因此您将使用 rabbitmq://localhost/prod 进行生产。当然,这些值不应该是 hard-coded,而是来自配置。

我相信虚拟主机可以完全满足您的需求。

如果你真的需要 运行 测试环境完全分离,你可以 运行 它在 Docker 容器中。当您需要一个干净的环境时,此选项将使您能够杀死整个事物并从头开始。您可以轻松地重新映射默认端口以避免与生产实例发生冲突:

docker run -d --name test-rmq -p 5673:5672 -p 8080:15672 rabbitmq:3-management

如果您 运行 上面的命令,新实例将在 localhost:5673 上通过 AMQP 访问,管理插件将在 http://localhost:8080