RabbitMQ

MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订阅队列中的消息。RabbitMQ是MQ产品的典型代表,是一款基于AMQP协议可复用的企业消息系统。业务上,可以实现服务提供者和消费者之间的数据解耦,提供高可用性的消息传输机制,在实际生产中应用相当广泛。本文意在介绍Rabbitmq的基本原理,以及在python下的各种应用。

python中的queue概念:

  1. 线程queue:只是用于多个线程之间,进行数据同步交互的。
  2. 进程queue:只是用户父进程与子进程进行交互,或者属于同一父进程下的多个子进程进行交互。

一、安装:

1、windows:

RabbitMQ依赖的语言 erlang:下载

RabbitMQ软件:下载

windows下实现远程访问RabbitMQ:查看

2、Linux:

Linux:安装步骤

3、python下使用RabbitMQ:

RabbitMQ的python使用文档 :查看

安装python rabbitMQ modul: pip3 install pika

pika演示文档:查看

二、基本示例:

1、队列通信图示意:

2、代码示例:

2.1、producer(发送消息)

建立socket->声明管道->声明queue->通过一个exchange 发送内容至queue->关闭连接

import pika

# 声明一个socket 实例
connect = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
# 声明一个管道
channel = connect.channel()
# 声明queue名称为test
channel.queue_declare(queue="test") #RabbitMQ的消息永远不会被直接发送到队列中,它总是需要经过一次交换
channel.basic_publish(exchange='',
routing_key="test",#queue名称
body="hello word") #发送给消费者的消息 print("Sent 'hello world'") connect.close()

2.2 consumers(接受消息)

创建socket连接->声明管道->声明queue->创建回调函数callback接受消息->开启不停消费

import pika

# 声明socket实例
connect = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
# 声明一个管道 虽然在之前的produce代码中声明过一次管道,
# 但是在不知道produce中的管道是否运行之前(如果未运行,consumers中也不声明的话就会报错),
# 在consumers中也声明一次是一种正确的做法
channel = connect.channel() #声明管道
channel.queue_declare(queue="test") #回调函数
def callback(h, method, properites, body):
print("-----", h, method, properites, body)
print("Received %r" % body)
#ch.basic_ack(delivery_tag=method.delivery_tag) 当no_ack=Flase时,手动确认收到消息 channel.basic_consume(callback, #回调函数
queue="test", #queue名称
no_ack=True) # 不确认消息是否被接收 print("Waiting for messages")
#这个start只要一启动,就一直运行,它不止收一条,而是永远收下去,没有消息就在这边卡住
channel.start_consuming()

  

#输出

Waiting for messages
----- <BlockingChannel impl=<Channel number=1 OPEN conn=<SelectConnection OPEN socket=('::1', 60127, 0, 0)->('::1', 5672, 0, 0)
params=<ConnectionParameters host=localhost port=5672 virtual_host=/ ssl=False>>>>
<Basic.Deliver(['consumer_tag=ctag1.0fee7eb3d9e14d838c5676de6768991b', 'delivery_tag=1', 'exchange=', 'redelivered=False', 'routing_key=test'])> <BasicProperties>
b'hello word'
Received b'hello word'

callback中的ch,method,properites分别是:

  • ch:是send端管道的内存对象的地址
  • method:指的send端的是发给谁,发给哪个queue的一些信息
  • properites:send端的属性,这边指的send端发过来给recive端的属性
  • body:是send端发过来的消息

3、远程访问RabbitMQ

import pika
# 全局变量
RabbitMQ_IP = '192.168.116.1'
RabbitMQ_PORT = 5672
RabbitMQ_USER = 'test'
RabbitMQ_PASSWORD = '123456'
login_broker = pika.PlainCredentials(RabbitMQ_USER, RabbitMQ_PASSWORD)
conn_param = pika.ConnectionParameters(RabbitMQ_IP, RabbitMQ_PORT, credentials=login_broker)
conn = pika.BlockingConnection(conn_param)
channel = conn.channel()

三、RabbitMQ的轮询机制

1、消息轮询

在这种模式下,RabbitMQ会默认把(producer)发的消息依次分发给各个消费者(consumers),跟负载均衡差不多

1个生产者  ----> 3个消费者

①初始化状态:3个消费者都在等待生产者发消息

②生产者发第1条消息:只有第1个消费者受到消息,第2个和第3个消费者没有收到消息

③生产者发第2条消息:只有第2个消费者受到消息,第1个和第3个没有收到的消息

④生产者发第3条消息:只有第3个收到消息,第1个和第2个没有收到消息。

2、no_ack参数分析( 全称no acknowlargement)

no_ack 的用途:确保 message 被 consumer “成功”处理了。这里“成功”的意思是,(在设置了 no_ack=false 的情况下)只要 consumer 手动应答了 Basic.Ack ,就算其“成功”处理了。

2.1、no_ack = Ture (自动应答)代表服务器不关心produce 发出的消息是否被consumers收到(消费):

在这种情况下,consumer 会在接收到 Basic.Deliver + Content-Header + Content-Body 之后,立即回复 Ack 。而这个 Ack 是 TCP 协议中的 Ack 。此 Ack 的回复不关心 consumer 是否对接收到的数据进行了处理,当然也不关心处理数据所需要的耗时

三个消费者,一个生产者(前两个消费者,time.sleep()没有被注释,用来模拟两个宕机的客户端,第三个消费者,注释掉了time.sleep(),用来模拟正常的客户端)

①初始化状态:3个消费者都在等待生产者发消息

②生产者发第1条消息:前两个宕机个消费者没有受到消息,第3个消费者正常的消费者也没有收到消息

③结束第一个和第二个消费者进程(宕机客户端),第三个消费者(没有宕机的客户端)没有收到消息

2.2、no_ack = Flase (手动应答)代表服务器关心produce 发出的消息是否被consumers收到(消费)

在这种情况下,要求 consumer 在处理完接收到的 Basic.Deliver + Content-Header + Content-Body 之后才回复 Ack 。而这个 Ack 是 AMQP 协议中的 Basic.Ack 。此 Ack 的回复是和业务处理相关的,所以具体的回复时间应该要取决于业务处理的耗时。

三个消费者,一个生产者(前两个消费者,time.sleep()没有被注释,用来模拟两个宕机的客户端,第三个消费者,注释掉了time.sleep(),用来模拟正常的客户端)

①初始化状态:3个消费者都在等待生产者发消息

②生产者发第1条消息:前两个宕机个消费者没有受到消息,第3个消费者正常的消费者也没有收到消息

③结束第一个和第二个消费者进程(宕机客户端),第三个消费者(没有宕机的客户端)收到消息

【python】-- RabbitMQ 安装、基本示例、轮询机制的更多相关文章

  1. 通过 PowerShell 支持 Azure Traffic Manager 外部端点和权重轮询机制

    Jonathan TulianiAzure网络 - DNS和 Traffic Manager高级项目经理 在北美 TechEd 大会上,我们宣布了 Azure Traffic Manager将支持 ...

  2. 12.nodejs事件轮询机制

    一:nodejs事件轮询机制  就是  函数的执行顺序 <script type="text/javascript"> setImmediate(function(){ ...

  3. nginx基本配置与参数说明以及Nginx中的upstream轮询机制介绍

    转自:http://blog.csdn.net/happydream_c/article/details/54943802 一.nginx简介 Nginx (发音为[engine x])专为性能优化而 ...

  4. OSChinaclient源代码学习(3)--轮询机制的实现

    主要以OSChina Androidclient源代码中Notice的轮询机制进行解读. 一.基础知识 一般IM(即使通讯)的实现有两种方式:推送和轮询,推送就是server主动向client发送消息 ...

  5. 面试题: nodejs 的事件轮询机制

    setTimeout(function(){ console.log('setTimeout()执行了') },0) setImmediate(function(){ console.log('set ...

  6. kafka Poll轮询机制与消费者组的重平衡分区策略剖析

    注意本文采用最新版本进行Kafka的内核原理剖析,新版本每一个Consumer通过独立的线程,来管理多个Socket连接,即同时与多个broker通信实现消息的并行读取.这就是新版的技术革新.类似于L ...

  7. RabbitMQ基本示例,轮询机制,no_ack作用

    一.RabbitMQ简介: ''' RabbitMQ就是消息队列 之前不是学了Queue了吗,都是队列还学RabbitMQ干嘛? 干的事情是一样的 Python的Queue有两个, 一个线程Queue ...

  8. JS中的异步以及事件轮询机制

    一.JS为何是单线程的? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊.(在JAVA和c#中的异步 ...

  9. Nginx中的upstream轮询机制介绍

    Nginx中upstream有以下几种方式: 1.轮询(weight=1) 默认选项,当weight不指定时,各服务器weight相同, 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器d ...

随机推荐

  1. .net平台 基于 XMPP协议的即时消息服务端简单实现

    .net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...

  2. Java千百问_03基本的语法(005)_二进制是如何做位运算的

    点击进入_很多其它_Java千百问 二进制是如何做位运算的 程序中的全部数在计算机内存中都是以二进制的形式储存的.位运算说白了,就是直接对整数在内存中的二进制位进行操作. 其它运算符看这里:java种 ...

  3. Node.js 使用jQuery取得Nodejs http服务端返回的JSON数组示例

    server.js代码: // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http" ...

  4. 图解HTTP第六章:HTTP首部

    学习HTTP首部的结构和首部中各字段的用法. HTTP首部字段 使用首部字段是为了给浏览器和server提供报文主体大小.所使用的语言.认证信息等内容. 首部字段相应单个HTTP首部能够有多个值.假设 ...

  5. quick-cocos2d-x教程9:实例之加上背景图片

    在梳理完quick-cocos2d-x框架的各个文件夹后,我们開始我们的实例教程,在helloworld后面.加上一张图片,lua编辑器,我用的lua editor.还不错. 我们首先还是參照教程.创 ...

  6. Yandex.Algorithm 2011 A. Double Cola

    1.题目描写叙述:点击打开链接 2.解题思路:本题是一道找规律的数学题,通过题意描写叙述不难知道,相当于有5棵二叉树构成了一个森林,须要你按层次遍历找到第n个人是谁. 观察后不难发现,如果最開始的一层 ...

  7. linux之ftp命令详解

    我们在使用ftp客户端访问到ftp服务器之后,往往需要进行相关操作,比如从远程机器上下载文件,或者将文件传输到远程机器上.需要使用ftp的相关命令,本文讲述了ftp常用的一些操作. 方法/步骤     ...

  8. 【Oracle】使用BBED跳过丢失的归档

    在recover datafile的过程其中假设丢失了须要的归档将使得recover无法进行.使用bbed工具能够跳过丢失的归档进行recover datafile. 实验步骤例如以下: SYS@OR ...

  9. void 指针的转换

    不论什么类型的指针都能够显式转换为void类型,且不会丢失数据.例如以下面程序: #include<stdio.h> int main(void) { short a=5; void *p ...

  10. atitit.基于bat cli的插件管理系统.doc

    atitit.基于bat cli的插件管理系统.doc /AtiPlatf/src_atibrow/com/attilax/cmd/CmdX.java pathx.isWebPathMode=true ...