RabbitMQ之Python
来源:互联网 发布:天谕美女捏脸数据 编辑:程序博客网 时间:2024/06/07 09:52
rabbitmq-server官方文档:https://www.rabbitmq.com/tutorials/tutorial-one-python.html
pika Python client 官方异常错误文档:http://pika.readthedocs.io/en/latest/modules/exceptions.html
一、
首先,这篇文档的开端,得益于链接:http://blog.csdn.net/fgf00/article/details/52872730博主的文档的启蒙
RabbitMQ是消息队列,【Disk、Socket、其他中间件】这里中间件不仅可以支持两个程序之间交互,可以支持多个程序,可以维护好多个程序的队列。
像这种公共的中间件有好多成熟的产品:
RabbitMQ
ZeroMQ
ActiveMQ
……
RabbitMQ:erlang语言 开发的。
Python中连接RabbitMQ的模块:pika 、Celery(分布式任务队列) 、haigha
可以维护很多的队列
RabbitMQ 教程官网:http://www.rabbitmq.com/getstarted.html
几个概念说明:
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务
二、
(注意:引起下面程序出错的原因,我在这之前将guest用户删除了,自己添加了个admin用户。)
Python实现hello world的发送---->中间件rabbitmq---->接收
代码如下:
producer.py(发送者、生产者)
import pika'''建立连接'''connection=pika.BlockingConnection(pika.ConnectionParameters('localhost',5672));channel=connection.channel();channel.queue_declare(queue='hello');#创建了一个消息队列channel.basic_publish(exchange='',routing_key='hello',body='Hello World');#默认交换机、队列名、消息内容print("[x]sent 'Hello World!");connection.close();#确保网络缓冲区被刷新,并且我们的消息实际上传递给RabbitMQ
import pikaimport time#creds_broker=pika.PlainCredentials("admin","admin")connection=pika.BlockingConnection(pika.ConnectionParameters('localhost'));channel=connection.channel();channel.queue_declare(queue='hello');def callback(ch,method,properties,body): print(ch,method,properties); print("[x] Received %r"%body); time.sleep(15); ch.basic_ack(delivery_tag=method.delivery_tag);channel.basic_consume(callback,queue='hello');print('[x]Waiting for messages.To exit press CTRL+C');channel.start_consuming();
之后,运行consumer.py程序,出现
或者是在cmd中运行:
python consumer.py得到同样的结果。
找到原因所在:
class ProbableAuthenticationError(AMQPConnectionError): def __repr__(self): return ('Client was disconnected at a connection stage indicating a ' 'probable authentication error: %s' % (self.args,))
翻译过来就是:
客户端在连接阶段断开连接,指示可能的认证错误
解决方法:
参考链接:http://blog.csdn.net/lvyuan1234/article/details/70145690内容如下:
我用python写了一个脚本consumer.py文件,想测试集群,consumer.py连接集群部分内容如下:
<span style="font-size:18px;">if __name__ == "__main__": AMQP_SERVER = sys.argv[1] AMQP_PORT = int(sys.argv[2]) #/(ctc.3) Establish broker connection settings creds_broker = pika.PlainCredentials("guest", "guest") conn_params = pika.ConnectionParameters( AMQP_SERVER, port=AMQP_PORT, virtual_host="/", credentials=creds_broker)</span>
ProbableAuthenticationError,意思就是登录失败
在网上查说是guest用户仅限于localhost连接,不能用于远程连接,要想用于远程连接,就必须修改rabbitmq配置文件
#vi /etc/rabbitmq/rabbitmq.config
将%% {loopback_users, [<<"guest">>]}, 改为 {loopback_users, []},改完后重启,我按照网上说的做,结果rabbitmq启动不了,还报如下错误:
{"could not start kernel pid",application_controller,"error in config file "/etc/rabbitmq/rabbitm.config\" (296): syntax error before ']' "}
我又改回来,又可以启动了,后来又在网上搜到了另一个解决办法:
Starting with RabbitMQ 3.3 you need to create a new account to use remotely, andguest/guest can only be used locally.
翻译过来就是从3.3版本开始远程连接只能新创建用户,guest只能本地连接,所以
远程访问rabbitmq:自己增加一个用户,步骤如下:l1. 创建一个admin用户:sudo rabbitmqctl add_user admin 123123l2. 设置该用户为administrator角色:sudo rabbitmqctl set_user_tags admin administratorl3. 设置权限:sudo rabbitmqctl set_permissions -p '/' admin '.' '.' '.'l4. 重启rabbitmq服务:sudo service rabbitmq-server restart之后就能用admin用户远程连接rabbitmq server了。
<span style="font-size:18px;">if __name__ == "__main__": AMQP_SERVER = sys.argv[1] AMQP_PORT = int(sys.argv[2]) #/(ctc.3) Establish broker connection settings creds_broker = pika.PlainCredentials("admin", "123123") conn_params = pika.ConnectionParameters( AMQP_SERVER, port=AMQP_PORT, virtual_host="/", credentials=creds_broker)</span>
在终端输入#python consumer.py localhost 5670
就ok了,连上了集群,通过了负载均衡测试,原来就是换一个账号,别用guest,如果你的集群是在一台机器上搭建的,即单机模式的话,guest说不定可以,我没试过
三、我先是又添加了原来的guest用户;
(其他配置
1. 安装完以后erlang需要手动设置ERLANG_HOME 的系统变量。
set ERLANG_HOME=F:\Program Files\erl9.0
#环境变量`path`里加入:%ERLANG_HOME%\bin
#环境变量`path`里加入: 安装路径\RabbitMQ Server\rabbitmq_server-3.6.10\sbin
2.激活Rabbit MQ’s Management Plugin
使用Rabbit MQ 管理插件,可以更好的可视化方式查看Rabbit MQ 服务器实例的状态,你可以在命令行中使用下面的命令激活。
rabbitmq-plugins.bat enable rabbitmq_management
3.创建管理用户
rabbitmqctl.bat add_user sa 123456
4. 设置管理员
rabbitmqctl.bat set_user_tags sa administrator
5.设置权限
rabbitmqctl.bat set_permissions -p / sa ".*" ".*" ".*"
6. 其他命令
#查询用户:
rabbitmqctl.bat list_users
#查询vhosts:
rabbitmqctl.bat list_vhosts
#启动RabbitMQ服务:
net stop RabbitMQ && net start RabbitMQ (需在管理员权限下,否则出现系统错误5)
以上这些,账号、vhost、权限、作用域等基本就设置完了。)
然后,重新跟cmd 中运行程序,成功。
第二个cmd端:
- python之rabbitMQ
- python之rabbitMQ
- python之rabbitMQ
- python之rabbitMQ
- python之rabbitMQ
- RabbitMQ之Python
- python系列之 RabbitMQ -- Routing
- python系列之 RabbitMQ -- TOPICS
- python系列之 RabbitMQ - RPC
- Python操作RabbitMQ之Pika
- RabbitMQ工作队列之Python实现
- python系列之 RabbitMQ - hello world
- python系列之 RabbitMQ - work queues
- python系列之 RabbitMQ -- Publish/Subscribe
- python学习之路-RabbitMQ-day11
- Python rabbitmq
- python-rabbitmq
- rabbitMQ-python
- LeetCode刷题(20)
- 4 Values whose Sum is 0 POJ
- 《Discrete Mathematic with Applications》读书笔记二
- C语言#define之宏定义的使用
- gcc入门
- RabbitMQ之Python
- c语言中数组长度的计算
- 在Eclipse中安装Hibernate Tools
- 1.编写手机类型;2.输出张三李四的姓名...;3.小组内各成员信息显示
- C语言提高-28讲: 字符串、字符数组、字符指针
- mac/linux中vim永久显示行号、开启语法高亮
- Python TIPS上一道关于人民币金额小写转大写的题
- 性能测试影响因素之考虑实际场景
- 自动轮播RollPagerView