MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。

MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。

RabbitMQ是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统。

推荐文章:

1.介绍与python使用

2.RabbitMQ了解

3.安装以及大致了解

4.windows下的安装(其中注意版本一致,Erlang版本不要太低)

补充:远程连接rabbitmq server需要配置权限

1.在服务端创建创建rabbitmq账号

sudo rabbitmqctl  add_user 用户名 密码

2.为账号配置权限

推文:RabbitMQ用户角色及权限控制

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)简单队列使用,消息依次分发(一对一),消息持久化处理的更多相关文章

  1. (六)RabbitMQ消息队列-消息任务分发与消息ACK确认机制(PHP版)

    原文:(六)RabbitMQ消息队列-消息任务分发与消息ACK确认机制(PHP版) 在前面一章介绍了在PHP中如何使用RabbitMQ,至此入门的的部分就完成了,我们内心中一定还有很多疑问:如果多个消 ...

  2. RabbitMq 之简单队列

    简单队列类似于我们的生产者,消费者, 一个生产者,对应一个消费者. 直接上代码: package com.j1.rabbitmq.simple; import com.j1.rabbitmq.util ...

  3. RabbitMQ (二) 简单队列

    参考:https://blog.csdn.net/vbirdbest/article/details/78583480 简单队列的模型: P : 生产者,即 Producer C : 消费者,即 Co ...

  4. RabbitMQ消息队列(六)-消息任务分发与消息ACK确认机制(.Net Core版)

    在前面一章介绍了在.Net Core中如何使用RabbitMQ,至此入门的的部分就完成了,我们内心中一定还有很多疑问:如果多个消费者消费同一个队列怎么办?如果这几个消费者分任务的权重不同怎么办?怎么把 ...

  5. python基础一 ------简单队列用作历史记录

    #需求:测试历史记录,一个猜字游戏,能在重新进入游戏时查看输入历史# #-*-coding:utf-8-*- from random import randint from collections i ...

  6. python Rabbitmq编程(一)

    python Rabbitmq编程(一) 实现最简单的队列通信 send端 #!/usr/bin/env python import pika credentials = pika.PlainCred ...

  7. RabbitMQ之六种队列模式

    先学习一下RabbitMQ中的六种队列,只学习前五种,具体的官方文档地址是:http://next.rabbitmq.com/getstarted.html 导入maven依赖: <depend ...

  8. Python RabbitMQ消息队列

    python内的队列queue 线程 queue:不同线程交互,不能夸进程 进程 queue:只能用于父进程与子进程,或者同一父进程下的多个子进程,进行交互 注:不同的两个独立进程是不能交互的.   ...

  9. 【python】-- RabbitMQ 队列消息持久化、消息公平分发

    RabbitMQ 队列消息持久化 假如消息队列test里面还有消息等待消费者(consumers)去接收,但是这个时候服务器端宕机了,这个时候消息是否还在? 1.队列消息非持久化 服务端(produc ...

随机推荐

  1. 小学四则运算APP 第一个冲刺 第八天

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第一次冲刺阶段时间:11.17~11.27 本次发布的是还未完成的功能二(选择题): ChoiceActivity.java: packa ...

  2. 开源通用爬虫框架YayCrawler-页面的抽取规则定义

    本节我将向大家介绍一下YayCrawler的核心-页面的抽取规则定义,这也是YayCrawler能够做到通用的主要原因之一.如果我要爬去不同的网站的数据,尽管他们的网站采用的开发技术不同.页面的结构不 ...

  3. PAT 1057 数零壹

    https://pintia.cn/problem-sets/994805260223102976/problems/994805270914383872 给定一串长度不超过 10​5​​ 的字符串, ...

  4. Vue 的语法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Log4Net日志配置

    1.添加Log4net.dll引用 将release版Log4net.dll拷贝到Lib文件夹,然后添加引用.

  6. 关于python format()用法详解

    str.format() 这个特性从python2.6而来 其实实现的效果和%有些类似 不过有些地方更方便 通过位置映射: In [1]: '{0},{1}'.format('kzc',18) Out ...

  7. Linux基础学习(6)--Linux软件安装

    第六章——Linux软件安装 一.软件包管理简介 1.软件包分类: (1)源码包:脚本安装包 (2)二进制包(RPM包.系统默认包) 2.源码包: (1)源码包的优点:开源,如果有足够的能力,可以修改 ...

  8. Conjugate Function

    共轭函数 共轭函数的定义: 设函数f:Rn→R,定义函数f∗:Rn→R为: f∗(y)=sup(<y,x>−f(x))  x∈D 此函数称为函数f的共轭函数.即函数yx和函数f(x)之间差 ...

  9. jQuery之制作简单的轮播图效果

    [源代码] 链接:https://pan.baidu.com/s/1XpZ66D9fmSwWX3pCnGBqjA 密码:w104 [整体构思] 这个轮播图使用的是jQuery,所以Js的整体代量比较少 ...

  10. 【BZOJ2425】[HAOI2010]计数(组合数学)

    [BZOJ2425][HAOI2010]计数(组合数学) 题面 BZOJ 洛谷 题解 很容易的一道题目. 统计一下每个数位出现的次数,然后从前往后依次枚举每一位,表示前面都已经卡在了范围内,从这一位开 ...