c# - MassTransmit/RabbitMQ 同一台机器上的多个不同实例
问题描述
我想知道是否可以在同一台服务器上运行多个 MassTransmit 或 RabbitMQ 实例。基本上,我们有一个在 RabbitMQ 之上使用 MassTransmit 的 .net 应用程序。不幸的是,我们的许多客户在同一台服务器上同时运行实时环境和测试环境,因此为了部署到现实世界,我们需要一种拥有多个实例或能够在实时和测试之间隔离消息的方法。
我有一些想法 1) 执行以下操作:https ://lazareski.com/multiple-rabbitmq-instances-on-1-machine/ 这里的问题是它依赖于客户端站点上的大量配置。
2)我可以在所有消息中包含一个标头,并且每个消费者在消费消息之前检查是否存在正确的标头(例如标头具有“实时”或“测试”。)显然这意味着所有消息都是从所有实例接收的,无论它们是是否适合他们,这远非理想。
理想情况下,我希望能够在客户端站点上进行最少的设置,例如每个环境的虚拟子实例或目录。
解决方案
有两种方法可以解决此问题。
第一种方式是最明显的——你需要使用虚拟主机。
从文档中:
虚拟主机提供资源的逻辑分组和分离。物理资源的分离不是虚拟主机的目标,应该被视为实现细节。
在您的 RMQ 实例中创建两个名为test
andprod
的虚拟主机,您在 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
推荐阅读
- mysql - 来自另一个字段的 Codeigniter 查询更新集
- scala - java.lang.NoClassDefFoundError: org/apache/flink/streaming/api/scala/StreamExecutionEnvironment
- c# - 如何使用 Dapper.Contrib 通过唯一键获取实体?
- ios - 为什么我在快速向上移动键盘时视图和滚动视图之间出现差距?
- c# - NavigationView 不会在启用/需要页面缓存的情况下切换
- php - 如何从 mapbox 中的 php 文件中获取多个实时数据标记?
- angular - 如何在不更改默认超时的情况下向 browser.wait() 添加消息?
- javascript - ES6:根据另一个数组顺序对数组进行排序
- javascript - 使用 Leaflet.PolylineDecorator 我得到未定义的读取属性“破折号”
- java - 黄瓜junit中的标签继承