【问题标题】:MassTransmit/RabbitMQ multiple distinct instances on the same machineMassTransmit/RabbitMQ 同一台机器上的多个不同实例
【发布时间】:2019-11-30 04:12:09
【问题描述】:
我想知道是否可以在同一台服务器上运行多个 MassTransmit 或 RabbitMQ 实例。基本上,我们有一个在 RabbitMQ 之上使用 MassTransmit 的 .net 应用程序。不幸的是,我们的许多客户在同一台服务器上同时运行实时环境和测试环境,因此为了部署到现实世界,我们需要一种拥有多个实例或能够在实时和测试之间隔离消息的方法。
我的一些想法
1)做类似的事情:https://lazareski.com/multiple-rabbitmq-instances-on-1-machine/
这里的问题是它依赖于客户端站点上的大量配置。
2) 我可以在所有消息中包含一个标头,并且每个消费者在使用该消息之前检查是否存在正确的标头(例如标头具有“实时”或“测试”。)显然这意味着所有消息都来自所有实例,无论它们是否适合他们,这远非理想。
理想情况下,我希望能够在客户端站点上以最少的设置做一些事情,例如每个环境的虚拟子实例或目录。
【问题讨论】:
标签:
c#
.net
rabbitmq
masstransit
【解决方案1】:
有两种方法可以解决此问题。
第一种方式是最明显的——你需要使用虚拟主机。
来自documentation:
虚拟主机提供资源的逻辑分组和分离。
物理资源的分离不是虚拟主机的目标,并且
应该被视为一个实现细节。
在您的 RMQ 实例中创建两个虚拟主机,分别称为 test 和 prod,您在 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 上