MassTransmit / RabbitMQ在同一台计算机上的多个不同实例

时间:2019-07-22 08:16:17

标签: c# .net rabbitmq masstransit

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

来自documentation

  

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

在您的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进行生产。自然,这些值不应硬编码,而应来自配置。

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

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

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

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