RabbitMQ镜像队列初始化连接时的“优化”
2017-03-30 10:46
405 查看
之前发过一篇帖子 应用.Net+Consul维护RabbitMq的高可用性,然后最近老大问我当初我这么搞是抽的什么想法- -然后顺便贴了两行C#代码:
AutomaticRecoveryEnabled的作用就是断线重连,假如当前的连接断开了,连接不会释放
TopologyRecoveryEnabled 重连后恢复当前的工作进程,比如channel、queue、发布的消息进度等。
看上去其实却是比较方便的,为了狡辩我当场列出了我设计的方案的主要优点:
1.rabbitmq网关设计的时候一方面是为了让客户端能够保证建立与master节点的连接,直连master性能较高。
2.通过配置队列名+VirthHost可以获取队列信息,Consul可以起到配置中心的作用,可配置性高一些(其实此处是狡辩。。)
3.RabbitMQ与Master队列建立的连接在发生故障时会第一时间查询网关获取新的Mater队列信息进行重连(当然代码内部也有重试机制,不会随便就更换连接的),相比于AutomaticRecoveryEnabled效率更高一些。
4.客户端SDK内部实现定时更新队列连接,发现Master节点更换时重新建立连接
看上去我设计的方案还是有点意义的(其实是真懒得改代码)
不过此处有个问题就是既然创建连接时的参数可以提供多个IP的集合,假如RabbitMQ提供的客户端SDK内部实现的更好,那我狡辩什么不也完戏了吗。。。于是假装下载了下客户端sdk代码扫了扫,此处以C#代码为例,代码还是比较简单的。github地址
直接定位ConnectionFactory类找CreateConnection()方法
View Code
就是随机排序一下。。不过这么看自己实现下IEndpointResolver接口改个选择master队列的策略也是不错的。
var factory = new ConnectionFactory() { UserName = "username", Password = "password", AutomaticRecoveryEnabled = true, TopologyRecoveryEnabled = true }; Connection = factory.CreateConnection(new string[3] { "ip1", "ip2", "ip3" });
AutomaticRecoveryEnabled的作用就是断线重连,假如当前的连接断开了,连接不会释放
TopologyRecoveryEnabled 重连后恢复当前的工作进程,比如channel、queue、发布的消息进度等。
看上去其实却是比较方便的,为了狡辩我当场列出了我设计的方案的主要优点:
1.rabbitmq网关设计的时候一方面是为了让客户端能够保证建立与master节点的连接,直连master性能较高。
2.通过配置队列名+VirthHost可以获取队列信息,Consul可以起到配置中心的作用,可配置性高一些(其实此处是狡辩。。)
3.RabbitMQ与Master队列建立的连接在发生故障时会第一时间查询网关获取新的Mater队列信息进行重连(当然代码内部也有重试机制,不会随便就更换连接的),相比于AutomaticRecoveryEnabled效率更高一些。
4.客户端SDK内部实现定时更新队列连接,发现Master节点更换时重新建立连接
看上去我设计的方案还是有点意义的(其实是真懒得改代码)
不过此处有个问题就是既然创建连接时的参数可以提供多个IP的集合,假如RabbitMQ提供的客户端SDK内部实现的更好,那我狡辩什么不也完戏了吗。。。于是假装下载了下客户端sdk代码扫了扫,此处以C#代码为例,代码还是比较简单的。github地址
直接定位ConnectionFactory类找CreateConnection()方法
public class DefaultEndpointResolver : IEndpointResolver { private List<AmqpTcpEndpoint> endpoints; private Random rnd = new Random(); public DefaultEndpointResolver (IEnumerable<AmqpTcpEndpoint> tcpEndpoints) { this.endpoints = tcpEndpoints.ToList(); } public IEnumerable<AmqpTcpEndpoint> All() { return endpoints.OrderBy(item => rnd.Next()); }
View Code
就是随机排序一下。。不过这么看自己实现下IEndpointResolver接口改个选择master队列的策略也是不错的。
相关文章推荐
- rabbitMQ的集群方式和镜像队列
- 单机磁盘故障引发RabbitMQ镜像队列数据丢失
- rabbitmq_mqtt插件单队列性能瓶颈优化
- rabbitmq配置集群和镜像队列
- RabbitMQ高可用镜像队列
- RabbitMQ如何保证发送端消息的可靠投递-发生镜像队列发生故障转移时
- rabbitmq—镜像队列
- RabbitMQ 集群设置镜像队列
- rabbitmq集群和镜像队列
- RabbitMQ高可用镜像队列
- RabbitMQ镜像队列实现原理
- rabbitmq——镜像队列
- rabbitmq配置集群和镜像队列
- RabbitMQ之镜像队列
- springboot~rabbitmq的队列初始化和绑定
- RabbitMQ镜像模式双节点部署时故障转移过程中队列中消息的状态
- rabbitmq_mqtt插件单队列性能瓶颈优化
- 单机磁盘故障引发RabbitMQ镜像队列数据丢失
- linux(deepin15.4)下部署集群RabbitMQ消息队列镜像模式(三)
- Rabbitmq创建镜像队列时的注意事项