RabbitMQ应用示例
更多详情参考官方文档:https://www.rabbitmq.com/tutorials/tutorial-six-python.html
参考博客:https://blog.csdn.net/weixin_41896508/article/details/80997828
01-HelloWorld(简单的消息队列)
send.py
import pika
#与RabbitMQ服务器建立连接
credential = pika.PlainCredentials('yang','abc123456')#erase_on_connect是否清楚凭证
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost',credentials=credential))
#创建频道
channel = connection.channel()#channel_number参数指定频道编号,建议默认pika自行管理
#创建频道传递消息的队列
channel.queue_declare(queue='hello') #向频道队列中发送消息
channel.basic_publish(exchange='',
routing_key='hello',
body='hello world!') print('[x]消息发送成功!')
connection.close()#断开连接
send.py
receive.py
import pika
credentials = pika.PlainCredentials('yang','abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1',port=5672,credentials=credentials))
channel = connection.channel()
channel.queue_declare(queue='hello') def callback(ch, method, properties, body):
print(f'{body.decode()}') channel.basic_consume(queue='hello',
auto_ack=True,#开启自动确认关闭手动确认
on_message_callback=callback) print(' [*] Waiting for messages. ')
channel.start_consuming()
recieve.py
02-WorkQueues(任务队列)
new_task.py
'''
任务生产者将任务发送到指定队列中,多个工作者进行均分协同处理(启多个工作者)
'''
import pika
credentials = pika.PlainCredentials('yang','abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1',5672,credentials=credentials))
channel = connection.channel() channel.queue_declare(queue='work_queue',durable=True)#durable=True指定消息持久化,出现异常不会丢失。注意basic_publish需要设置参数 for i in range(1000):
message = f'new_task{i}...'
channel.basic_publish(
exchange='',
routing_key='work_queue',
body=message,
properties = pika.BasicProperties(delivery_mode=2, )# 支持数据持久化:2代表消息是持久
)
print(f'Send>>>{message}') connection.close()
new_task.py
worker.py
import time
import random
import pika
credentials = pika.PlainCredentials('yang','abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1',5672,credentials=credentials))
channel = connection.channel() channel.queue_declare(queue='work_queue',durable=True)#durable=True指定消息持久化,出现异常不会丢失 def callback(ch, method, properties, body):
print(f'Rceive>>{body}')
time.sleep(random.random())
print(f'Done--{body.decode()}')
# 手动确认机制(在消费者挂掉没有给确认时,消息不会丢失)
ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_qos(prefetch_count=1)#此设置确保在没有进行确认之前当前接受得任务只有1个(不设置默认是平均分配)
channel.basic_consume(
queue='work_queue',
on_message_callback=callback
) channel.start_consuming()
worker.py
03-PublishSubcribe(订阅发布)
publish.py
'''
发布者发布一条任务,通过交换机发送到与此交换机简历连接的所有队列中进行共享(启多个订阅者)
'''
import pika
credentials = pika.PlainCredentials('yang','abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672, credentials=credentials)) channel = connection.channel() #创建频道的交换器(交换器负责将任务发送到连接词交换器的所有的队列中)
channel.exchange_declare(exchange='logs',
exchange_type='fanout',#创建一个fanout(广播)类型的交换机exchange,名字为logs
durable=True)#durabl持久化 for i in range(1000):
message = f'new_task{i}...'
channel.basic_publish(
exchange='logs',#指定交换机
routing_key='',#无需指定路由键队列,由交换机进行发送
body=message,
properties = pika.BasicProperties(delivery_mode=2, )# delivery_mode支持数据持久化:2代表消息是持久
)
print(f'Send>>>{message}') connection.close()
publish.py
subcribe.py
import pika
credentials = pika.PlainCredentials('yang','abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672, credentials=credentials)) channel = connection.channel() #与交换器建立连接
channel.exchange_declare(exchange='logs',exchange_type='fanout',durable=True)#durable持久化 #确定消息队列(不指定队列名,每个订阅者rabbirmq服务器连接都会创建一个随机队列)
result= channel.queue_declare(queue='',exclusive=True,durable=True)#exclusive=True当断开连接时,队列销毁(持久化没有用,设置了断开销毁)
queue_name= result.method.queue
#与交换机新建的的随机队列进行绑定
channel.queue_bind(exchange='logs',queue=queue_name) def callback(ch, method, properties, body):
print(f'Rceive>>{body}')
print(f'Done--{body.decode()}')
# 手动确认机制(在消费者挂掉没有给确认时,消息不会丢失)
ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_consume(
queue=queue_name,
on_message_callback=callback
) channel.start_consuming()
subcribe.py
06-RPC(远程过程调用)
rpc_client.py
import pika
import uuid class RpcClient(object):
def __init__(self):
credentials = pika.PlainCredentials('yang', 'abc123456')
self.connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1', 5672, credentials=credentials)) self.channel = self.connection.channel() # 随机创建一个唯一队列
result = self.channel.queue_declare(queue='', exclusive=True)
self.callback_queue = result.method.queue # 接收回调队列中的消息
self.channel.basic_consume(
queue=self.callback_queue,
on_message_callback=self.on_response,
auto_ack=True) def on_response(self, ch, method, props, body):
if self.corr_id == props.correlation_id:
self.response = body def call(self, m, n):
self.response = None
self.corr_id = str(uuid.uuid4())
# 想通信队列放入消息
self.channel.basic_publish(
exchange='',
routing_key='rpc_queue',
properties=pika.BasicProperties(
delivery_mode=2,#持久化参数
# content_type='application/json',#指定body数据类型,不指定则为字符串(有待测试)
reply_to=self.callback_queue, # 指定回调队列
correlation_id=self.corr_id, # 指定本次请求标识id
),
body=str(m) + ',' + str(n)
) while self.response is None:
self.connection.process_data_events()
return int(self.response) clinet_rpc = RpcClient() print(" [x] Requesting add(30,30)")
response = clinet_rpc.call(30,20)
print(" [.] Got %r" % response)
rpc_client.py
rpc_server.py
import pika credentials = pika.PlainCredentials('yang', 'abc123456')
connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1', 5672, credentials=credentials))
channel = connection.channel() channel.queue_declare(queue='rpc_queue', durable=True) # durable=True消息持久化 def add(m, n):
return m + n def on_request(ch, method, props, body):
m, n = body.decode().split(',')
response = add(int(m), int(n)) #将响应信息放入指定的回调队列中
channel.basic_publish(
exchange='',
routing_key=props.reply_to,#请求指定的响应队列
properties=pika.BasicProperties(correlation_id=props.correlation_id,),#请求设定的标识(无需设置持久化,每次响应之后回调队列销毁)
body=str(response)
)
ch.basic_ack(delivery_tag=method.delivery_tag) # 手动回复确认 channel.basic_qos(prefetch_count=1) # 在没有确认前只分配一个任务
channel.basic_consume(
queue='rpc_queue',
on_message_callback=on_request,
) print('Awaiting RPC requests...')
channel.start_consuming()
rpc_server.py
RabbitMQ应用示例的更多相关文章
- NET下RabbitMQ实践[示例篇]
在上一篇文章中,介绍了在window环境下安装erlang,rabbitmq-server,以免配置用户,权限,虚拟机等内容. 今天将会介绍如果使用rabbitmq进行简单的消息入队, ...
- RabbitMQ基本示例,轮询机制,no_ack作用
一.RabbitMQ简介: ''' RabbitMQ就是消息队列 之前不是学了Queue了吗,都是队列还学RabbitMQ干嘛? 干的事情是一样的 Python的Queue有两个, 一个线程Queue ...
- AMQP消息队列之RabbitMQ简单示例
前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个 ...
- laravel框架的rabbitmq使用示例[多队列封装]
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的.所有主要 ...
- rabbitmq 简单示例(Hello World)
一:消息中间件: AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计 RabbitMQ是实现AMQP( ...
- Spring Boot + RabbitMQ 使用示例
基础知识 虚拟主机 (Virtual Host): 每个 virtual host 拥有自己的 exchanges, queues 等 (类似 MySQL 中的库) 交换器 (Exchange): 生 ...
- RabbitMQ基础组件和SpringBoot整合RabbitMQ简单示例
交换器(Exchange) 交换器就像路由器,我们先是把消息发到交换器,然后交换器再根据绑定键(binding key)和生产者发送消息时的路由键routingKey, 按照交换类型Exchange ...
- springboot + rabbitmq 整合示例
几个概念说明:Broker:简单来说就是消息队列服务器实体.Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列.Queue:消息队列载体,每个消息都会被投入到一个或多个队列.Bindi ...
- 【rabbitmq】rabbitmq概念解析--消息确认--示例程序
概述 本示例程序全部来自rabbitmq官方示例程序,rabbitmq-demo: 官方共有6个demo,针对不同的语言(如 C#,Java,Spring-AMQP等),都有不同的示例程序: 本示例程 ...
随机推荐
- php正则匹配到字符串里面的a标签
$cont = preg_replace('/<a href=\"(.*?)\".*?>(.*?)<\/a>/i','',$cont);
- 2019-2020-1 20199328《Linux内核原理与分析》第五周作业
实验要求: 实验步骤: 这里以20号系统调用getpid为例进行实验,该函数的功能为:返回当前进程标识. getpid.c代码: 查看实验结果: 当前进程pid为:31042. 在C语言中编入汇编代码 ...
- Spring5参考指南:Bean作用域
文章目录 Bean作用域简介 Singleton作用域 Prototype作用域 Singleton Beans 中依赖 Prototype-bean web 作用域 Request scope Se ...
- HDU 6341 Let Sudoku Rotate
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #defi ...
- CTO为何要微服务评估
为什么定义参考模型 之前我的工作,大部分时间都是聚焦在某个产品/团队,为他们提供微服务/DevOps的实施及指导.进入公司后,同时参与了多个产品团队的改造研讨.其中最大的不同在于: 在面对一个团队的时 ...
- #if 和#ifdef的区别
转自:https://blog.csdn.net/zhangchiytu/article/details/7563329 先看个例子:#define TARGET_LITTLE_ENDINA 1#de ...
- MySQL Windows 环境安装
1.下载 MySQL Windows 安装包 下载地址:https://downloads.mysql.com/archives/installer/ 我这个是 MySQL 5.7 版本 2.直接双击 ...
- [计算机视觉]从零开始构建一个微软how-old.net服务/面部属性识别
大概两三年前微软发布了一个基于Cognitive Service API的how-old.net网站,用户可以上传一张包含人脸的照片,后台通过调用深度学习算法可以预测照片中的人脸.年龄以及性别,然后将 ...
- NLP(二十九)一步一步,理解Self-Attention
本文大部分内容翻译自Illustrated Self-Attention, Step-by-step guide to self-attention with illustrations and ...
- Spring Boot入门系列(十三)如何实现事务
前面介绍了Spring Boot 中的整合Mybatis并实现增删改查.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1 ...