首页 > 解决方案 > MassTransmit/RabbitMQ 同一台机器上的多个不同实例

问题描述

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

我有一些想法 1) 执行以下操作:https ://lazareski.com/multiple-rabbitmq-instances-on-1-machine/ 这里的问题是它依赖于客户端站点上的大量配置。

2)我可以在所有消息中包含一个标头,并且每个消费者在消费消息之前检查是否存在正确的标头(例如标头具有“实时”或“测试”。)显然这意味着所有消息都是从所有实例接收的,无论它们是是否适合他们,这远非理想。

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

标签: c#.netrabbitmqmasstransit

解决方案


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

第一种方式是最明显的——你需要使用虚拟主机。

文档中:

虚拟主机提供资源的逻辑分组和分离。物理资源的分离不是虚拟主机的目标,应该被视为实现细节。

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

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

所以你将rabbitmq://localhost/prod用于生产。自然,这些值不应该是硬编码的,而是来自配置。

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

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

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

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


推荐阅读