RabbitMQ 是一个实现了AMQP协议的标准的开元消息代理和队列服务器,它是企业级的消息系统,自带了集群,管理,插件系统等特性,在
高可用性,可扩展性,易用性做的很好
RabbitMQ 的几个概念:
1,消息包含有效载荷(也就是要传输的数据,可以使纯文本,也可以是json),标签(RabbitMQ使用它决定了发给哪个消费者)
2,发布者,也就是生产者,它创建了消息,并且设置标签
3,消费者,连接到代理服务器之上,接受消息的有效载荷(不需要标签)
RabbitMQ 是通过交换机来确定什么样的消费者的;
1,直连交换机(一对一),将一个队列绑定一个交换机的同时,赋予一个路由键,交换机会把它路由给绑定值同样为这个值的队列之中
2,主题交换机(一对多),用来实现消息的多播路由。由'.'来进行分割的词语,这些词语必须是相对应的业务相关联
3,扇形交换机(广播的形式),将消息路由绑定到所有的路由之中.
import sys import pika #使用了默认的虚拟主机与密码 parameters = pika.URLParameters('amqp://guest:guest@localhost:5672//') #connection 指的是消息代理 connection = pika.BlockingConnection(parameters) #获取信道,所有的发布消息,接收消息,订阅消息都是通过信道来完成的,相当于'电缆'(里面包裹着消息),一个tcp可以创建多个信道 channel =connection.channel() #durable=True 表示 RabbitMQ 崩溃时重新建立队列与交换机 #创建交换机 web_develop 制定交换类型为直接交换 channel.exchange_declare(exchange='web_develop',exchange_type='direct', passive=False,durable=True,auto_delete=False) # sys.argv[ ]其实就是一个列表,里边的项为用户输入的参数 # argv[0] 指的是 此模块在项目之中的路径 # print sys.argv[1] 指的是 第一个运行参数 python test.py manager 打印结果为 manager # print sys.argv[2] 指的是 第二个运行参数 python test.py manager abc 打印结果为 abc if len(sys.argv)!=1: mas=sys.argv[1] else: mas = 'haha' #delivery_mode = 2 表示永久储存,重启 RabbitMQ 也不会丢失 props =pika.BasicProperties(content_type='text/plain',delivery_mode=2) channel.basic_publish('web_develop','xxx_routing_kay',mas,properties=props) connection.close()
消费者代码
import pika # method_frame 表示标记信息 body是消息体 def on_massage(channel,method_frame,header_frame,body): channel.basic_ack(delivery_tag=method_frame.delivery_tag) print(body) parameters = pika.URLParameters('amqp://guest:guest@localhost:5672//') #connection 指的是消息代理 connection = pika.BlockingConnection(parameters) #获取信道 channel =connection.channel() #针对于直连交换机指定直连的队列 channel.exchange_declare(exchange='web_develop',exchange_type='direct', passive=False,durable=True,auto_delete=False) #声明队列,如果没有就创建,从队列之中取出数据 channel.queue_declare(queue='standard',auto_delete=True) #通过路由键将路由与队列绑定 channel.queue_bind(queue='standard',exchange='web_develop',routing_key='xxx_routing_kay') #指定回调函数,与队列 channel.basic_consume(on_massage,'standard') try: #开始消费 channel.basic_consuming() except KeyboardInterrupt: #停止消费 channel.stop_consuming() connection.close()