python---RabbitMQ(1)简单队列使用,消息依次分发(一对一),消息持久化处理
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。
MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。
RabbitMQ是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统。
推荐文章:
3.安装以及大致了解
4.windows下的安装(其中注意版本一致,Erlang版本不要太低)
补充:远程连接rabbitmq server需要配置权限
1.在服务端创建创建rabbitmq账号
sudo rabbitmqctl add_user 用户名 密码
2.为账号配置权限
sudo rabbitmqctl set_permissions -p / 账号 ".*" ".*" ".*"
set_permissions [-p vhost] {user} {conf} {write} {read}
该命令使用户具有/这个virtual host中所有资源的配置、写、读权限以便管理其中的资源
3.客户端连接时认证方式
#.设置远程账号密码
credentials = pika.PlainCredentials('账号', '密码') #.设置参数,创建连接,这是链接一个socket
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='远程主机ip',端口号,'/',credentials #/代表的是服务端rabbitmq的虚拟主机资源目录
))
#.根据socket连接,在其基础上创建Channel通道,
channel = connection.channel()
python使用:
简单队列模型:(exchange交换机不工作模式)

生产者:
import pika #.设置参数,创建连接
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'
))
#.根据连接创建Channel通道
channel = connection.channel()
#.创建queue(名为hello)和channel进行绑定
channel.queue_declare(queue='hello')
#.生成消息,发布到队列中
channel.basic_publish(exchange='',
routing_key='hello',#去相关队列中
body='Hello world')
print('Send Hello World th queue')
#.关闭连接 connection.close()
持久化处理:服务端注意,当服务端断电或者其他情况,导致消息原本存在内存中的消失,更可靠的是将数据放到磁盘中保存,更安全,但是降低效率 。
决定权在于客户端是否设置应答,若是无应答,消息接收后立刻消失,不需要持久化,有应答时,需要将消息持久化处理,因为可能客户端在调用回调函数需要耗时太长,中途挂了,那么这个消息在服务器端需要再次恢复到消息队列中。
#.创建queue(名为hello)和channel进行绑定
channel.queue_declare(queue='hello',durable=True) #durable持久化,将这个队列持久化,重启服务器,这个队列依旧存在
#.生成消息,发布到队列中
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello world',
properties=pika.BasicProperties( #将消息保存在本地磁盘持久化处理,在上面durable基础上,将持久化队列中的消息一块持久化了
delivery_mode=2,#默认是1
))
修改上面两处
消费者:
import pika #.设置参数,获取一个connection连接
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'
))
#.利用connection创建一个channel通道
channel = connection.channel()
#.将channel通道和queue(之前生产者创建的队列)进行绑定
channel.queue_declare(queue='hello')#生产者和消费者只要有一个先声明,就会去创建这个队列,不会重复创建 #回调函数,处理消息内容
def callback(ch,method,properties,body):
print("Recvived %s"%body) # consumer_callback(channel, method, properties, body)
# channel: BlockingChannel,通道实例
# method: spec.Basic.Deliver,头部消息,附带一些数据
# properties: spec.BasicProperties,
# body: str or unicode,数据内容,byte格式 #.创建消费者进行消息处理
channel.basic_consume(callback,
queue='hello',
no_ack=True)#无应答,默认false print("Waiting for message")
#.开启消费者
channel.start_consuming()#这里开始堵塞,等待获取信息,开始消费,这个是IO循环一致等待,不会退出
客户端注意:no_ack=True/False #无应答/有应答
#回调函数,处理消息内容
def callback(ch,method,properties,body):
import time
time.sleep() #在此处可以进行中断测试,查看有无应答
print("Recvived %s"%body)
若是回调函数处理数据时,需要耗费大量时间,而客户端并未处理而退出,那么这条消息是否应该继续存在在队列中,当设置无应答no_ack=True时,消息从队列中取出后即消失。消息的安全性不够,但是效率高
当设置为有应答no_ack=False时,消息经过客户端成功处理后会返回响应码进行应答操作,确保消息被处理后,才会从消息队列中删除。安全性够好,但是等待过程效率低
在设置为有应答时,需要在回调函数末尾中添加:
ch.basic_ack(delivery_tag=method.delivery_tag) #唯一标识,自动生成,用于在回调函数中,进行应答
进行回应
另外:对于rabbitmq的消息分发,默认是按照顺序,有几个消费者,大家一个一个来,但是由于每个消费者的消费速度不一致,会导致时间上,某些消费者会产生空闲
所以需要修改这种状态,在消费者这地方修改,修改消费者取数据模式,添加:
channel.basic_qos(prefetch_count=)
这样,谁空闲,谁就来获取数据
python---RabbitMQ(1)简单队列使用,消息依次分发(一对一),消息持久化处理的更多相关文章
- (六)RabbitMQ消息队列-消息任务分发与消息ACK确认机制(PHP版)
原文:(六)RabbitMQ消息队列-消息任务分发与消息ACK确认机制(PHP版) 在前面一章介绍了在PHP中如何使用RabbitMQ,至此入门的的部分就完成了,我们内心中一定还有很多疑问:如果多个消 ...
- RabbitMq 之简单队列
简单队列类似于我们的生产者,消费者, 一个生产者,对应一个消费者. 直接上代码: package com.j1.rabbitmq.simple; import com.j1.rabbitmq.util ...
- RabbitMQ (二) 简单队列
参考:https://blog.csdn.net/vbirdbest/article/details/78583480 简单队列的模型: P : 生产者,即 Producer C : 消费者,即 Co ...
- RabbitMQ消息队列(六)-消息任务分发与消息ACK确认机制(.Net Core版)
在前面一章介绍了在.Net Core中如何使用RabbitMQ,至此入门的的部分就完成了,我们内心中一定还有很多疑问:如果多个消费者消费同一个队列怎么办?如果这几个消费者分任务的权重不同怎么办?怎么把 ...
- python基础一 ------简单队列用作历史记录
#需求:测试历史记录,一个猜字游戏,能在重新进入游戏时查看输入历史# #-*-coding:utf-8-*- from random import randint from collections i ...
- python Rabbitmq编程(一)
python Rabbitmq编程(一) 实现最简单的队列通信 send端 #!/usr/bin/env python import pika credentials = pika.PlainCred ...
- RabbitMQ之六种队列模式
先学习一下RabbitMQ中的六种队列,只学习前五种,具体的官方文档地址是:http://next.rabbitmq.com/getstarted.html 导入maven依赖: <depend ...
- Python RabbitMQ消息队列
python内的队列queue 线程 queue:不同线程交互,不能夸进程 进程 queue:只能用于父进程与子进程,或者同一父进程下的多个子进程,进行交互 注:不同的两个独立进程是不能交互的. ...
- 【python】-- RabbitMQ 队列消息持久化、消息公平分发
RabbitMQ 队列消息持久化 假如消息队列test里面还有消息等待消费者(consumers)去接收,但是这个时候服务器端宕机了,这个时候消息是否还在? 1.队列消息非持久化 服务端(produc ...
随机推荐
- C#获取当月第一天和最后一天
当月第一天0时0分0秒: DateTime.Now.AddDays(1 - DateTime.Now.Day).Date 当月最后一天23时59分59秒: DateTime.Now.AddDays(1 ...
- MySQL: Connection Refused,调整 mysql.ini中的 max_connections
连接相同的结构的MySQL数据库,一套库Tomcat启动正常,另一套库一直报Connection Refused. 可以断定是连接数太小了.查找mysql.ini中的 max_connections, ...
- STL数据结构
priority_queue "C++ reference"上如此解释priority queue:"This context is similar to a heap, ...
- Postgresql 密码设置
今天下午 陷进去了 其实很简单的一个事情结果浪费了 接近一个小时. 做事情必须要细致一些. 自己的确做的不好. 这里面简单说一下pg_hba.conf 和 postgresql 密码的一些设置问题. ...
- Win10 1803 Spring Creators update Consumer edition的版本记录
安装时可选择的版本列表 安装完之后的版本: 3. 时间线更新 4. Focus assistant
- [读书笔记]Linux命令行与shell编程读书笔记03 文件系统等
1. 文件系统的种类 ext ext2 ext3 ext4 JFS XFS 其中ext3 开始支持journal日志模式 与raid卡类似 有 数据模式 排序模式 以及回写模式 数据模式最安全 回写 ...
- 简单对比一下不同Windows操作系统在相同硬件配置的情况下浏览器js引擎的性能
最近部门进行Windows客户端的测试产品单点性能, 感觉不在通的windows版本以及浏览器内核的情况下性能可能有差异, 也一直没有找到一个比较好的对比工具, 今天用chrome的控制台简单测试了下 ...
- Java代码redis基础操作
maven依赖包: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...
- ceph 性能测试
我在物理机上创建了5台虚拟机,搭建了一个ceph集群,结构如图: 具体的安装步骤参考文档:http://docs.ceph.org.cn/start/ http://www.centoscn.com/ ...
- BZOJ4378[POI2015]Logistyka——树状数组
题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进行s次操作.每次 ...