博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Pika 连接 rabbitmq 集群
阅读量:4195 次
发布时间:2019-05-26

本文共 3158 字,大约阅读时间需要 10 分钟。

使用 Pika 连接 rabbitmq 集群

使用 python 编程经常会用到 pika 来向 rabbitmq 发送消息,单个 rabbitmq 节点连接比较简单,本文介绍使用 rabbitmq 集群情况下的连接方式。

vip 连接方式

在 client 与 rabbitmq server 之间通过 haproxy 等负载均衡来提供 vip,我使用的环境就是采用这种方式,但是遇到某一节点挂掉时再访问 vip 连接 rabbitmq 集群会连接失败,常见 log 如下:

DEBUG:pika.adapters.select_connection:Using EPollPollerDEBUG:pika.callback:Added: {'callback':
>>, 'only': None, 'one_shot': True, 'arguments': None, 'calls': 1}DEBUG:pika.callback:Added: {'callback':
>>, 'only': None, 'one_shot': True, 'arguments': None, 'calls': 1}DEBUG:pika.callback:Added: {'callback':
>, 'only': None, 'one_shot': False, 'arguments': None}DEBUG:pika.callback:Added: {'callback':
>, 'only': None, 'one_shot': False, 'arguments': None}DEBUG:pika.callback:Added: {'callback':
>, 'only': None, 'one_shot': False, 'arguments': None}DEBUG:pika.adapters.select_connection:call_later: added timeout
with deadline=1538140088.706256 and callback=
>>; now=1538140088.71; delay=0INFO:pika.adapters.base_connection:Pika version 0.12.0 connecting to 10.10.11.1:5672ERROR:pika.adapters.base_connection:Read empty data, calling disconnectINFO:pika.connection:Disconnected from RabbitMQ at 10.10.11.1:5672 (-1): EOFERROR:pika.connection:Incompatible Protocol VersionsERROR:pika.connection:Connection setup failed due to The protocol returned by the server is not supported: (-1, 'EOF')DEBUG:pika.callback:Processing 0:_on_connection_errorDEBUG:pika.callback:Calling
> for "0:_on_connection_error"DEBUG:pika.callback:Processing 0:_on_connection_closedDEBUG:pika.callback:Calling
> for "0:_on_connection_closed"DEBUG:pika.callback:Incremented callback reference counter: {'callback':
>>, 'only': None, 'one_shot': True, 'arguments': None, 'calls': 2}DEBUG:pika.callback:Incremented callback reference counter: {'callback':
>>, 'only': None, 'one_shot': True, 'arguments': None, 'calls': 2}ERROR:pika.adapters.blocking_connection:Connection open failed - The protocol returned by the server is not supported: (-1, 'EOF')

这个报错通常是由于网络问题导致,尝试过 Telnet 连接 vip 和端口,都正常返回,目前还未找到 pika 访问 vip 连接 rabbitmq 失败的原因,所以采用类似于 openstack 中连接 rabbitmq 的方式,配置多主机列表,建立连接池。

配置 multiple hosts

openstack 配置transport_url 采用 rabbitmq 集群 host 列表方式,然后在 oslo.message 中建立连接池,通过 kombu 来使用 rabbitmq。参考这种方式,用 pika 实现。

pika 的官方文档中有示例参考

实际实现的时候会抛异常,原因是传递给 pika 需要是个实例而不是列表,官网上提供的方式把 host url 参数化后直接放到列表里传给 pika 进行连接:

node1 = pika.URLParameters('amqp://node1')node2 = pika.URLParameters('amqp://node2')node3 = pika.URLParameters('amqp://node3')all_endpoints = [node1, node2, node3]connection = pika.BlockingConnection(all_endpoints)

实际执行后报错如下:

Expected instance of Parameters, not [.........]

github 上提交的 issue:

目前不支持直接传入多 host url 来池化 rabbitmq 集群的连接,所以要在应用程序中单独实现。

用一个简单 for 循环来做:

random.shuffle(all_endpoints)for url in all_endpoints:    try:        logging.basicConfig(level=logging.DEBUG)        connection = pika.BlockingConnection(url)    except Exception as ex:        print str(ex)    else:        break

用 shuffle 来改变列表中的 host 顺序,可以起到负载均衡的作用。


小笨驴在吃草的时候创建了微信公众号,为方便更多觅食的“小笨驴”,为大家准备了大量的免费基础教学资料以及技术解决方案,还会定时发布一些好的技术文章,当然也会扯扯蛋、谈谈人生、呵呵,希望我们这群乐于分享技术的“小笨驴”团队越来越大!

转载地址:http://vqgoi.baihongyu.com/

你可能感兴趣的文章
【一天一道LeetCode】#30. Substring with Concatenation of All Words
查看>>
【一天一道LeetCode】#60. Permutation Sequence.
查看>>
【一天一道LeetCode】#62. Unique Paths
查看>>
【一天一道LeetCode】#61. Rotate List
查看>>
【一天一道LeetCode】#63. Unique Paths II
查看>>
【一天一道LeetCode】#36. Valid Sudoku
查看>>
【一天一道LeetCode】#75. Sort Colors
查看>>
【一天一道LeetCode】#76. Minimum Window Substring
查看>>
【计算机网络 第五版】阅读笔记之一:概述
查看>>
【计算机网络 第五版】阅读笔记之二:物理层
查看>>
【计算机网络 第五版】阅读笔记之三:数据链路层
查看>>
【计算机网络 第五版】阅读笔记之四:网络层
查看>>
【计算机网络 第五版】阅读笔记之五:运输层
查看>>
【一天一道LeetCode】#77. Combinations
查看>>
【一天一道LeetCode】#78. Subsets
查看>>
【一天一道LeetCode】#79. Word Search
查看>>
【一天一道LeetCode】#81. Search in Rotated Sorted Array II
查看>>
【数据结构与算法】深入浅出递归和迭代的通用转换思想
查看>>
【一天一道LeetCode】#83. Remove Duplicates from Sorted List
查看>>
【一天一道LeetCode】#91. Decode Ways
查看>>