RabbitMQ 相关概念和方法详解
名词解释
ConnectionFactory: 与RabbitMQ服务器连接的管理器。Connection: 与RabbitMQ服务器的连接。Channel: 与Exchange的连接。Exchange: 接收生产者的消息,并根据消息的RoutingKey和Exchange绑定的BindingKey分配消息。Queue: 存储消费者的消息。RoutingKey: 指定当前消息被谁接收。BindingKey: 指定当前Exchange下,什么样的RoutingKey会被下派到当前绑定的Queue中。
exchange_declare 方法详解
def exchange_declare(self, callback=None, exchange=None, exchange_type='direct', passive=False, durable=False, auto_delete=False, internal=False, nowait=False, arguments=None):
callback如果nowait=True且Exchange.DeclareOk时,调用这个回调方法。exchange交换器名称。exchange_type交换器类型,常见的如fanoutdirecttopic。passive如果为true, 则执行声明或者检查交换器是否存在。durable设置是否持久化。durable设置为true表示持久化,反之非持久化。持久化可以将交换器存盘,在服务器重启的时候不会丢失消息。auto_delete设置是否自动删除。auto_delete设置为true则表示自动删除。自动删除的前提是至少有一个队列或者交换器绑定,之后所有与这个交换器绑定的队列或者交换器都与此解绑。注意不能错误地把这个参数理解为:"当与此交换器连接的客户端都断开时,RabbitMQ 会自动删除本交换器"。internal设置是否是内置的。如果设置为true,则表示是内置的交换器,客户端程序无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这种方式。nowait如果设置为false, 则不期望RabbitMQ服务器有一个Exchange.DeclareOk这样响应。arguments其他一些结构化参数。比如:alternate-exchange。
exchange_bind 方法详解
def exchange_bind(self, callback=None, destination=None, source=None, routing_key='', nowait=False, arguments=None):
callback如果nowait=True且Exchange.DeclareOk时,调用这个回调方法。destinaction一种交换器。source消息从source交换器转发到destination交换器,从某种程度上看destination交换器可以是一种队列。routing_key用来绑定队列和交换器的路由键。nowait如果设置为false, 则不期望RabbitMQ服务器有一个Exchange.DeclareOk这样响应。arguments其他一些结构化参数。
queue_declare 方法详解
def queue_declare(self, queue='', passive=False, durable=False, exclusive=False, auto_delete=False, arguments=None):
queue队列名称。passive如果为true, 则执行声明或者检查队列是否存在。durable设置是否持久化。为true则设置队列为持久化。持久化的队列会存盘,在服务器重启的时候可以保证不丢失相关的信息。exclusive设置是否排他。为true则设置队列为排他的。如果一个队列被声明为排他队列,该队列对首次声明它的连接可见,并在连接断开时自动删除。这里需要注意三点:- 排他队列是基于连接(Connection)可见的,同一个连接的不同信道(Channel)是可以同时访问同一个连接创建的排他队列。
- "首次" 是指如果一个连接已经声明了一个排他队列,其他连接是不允许建立同名的排他队列,这个与普通队列不同。
- 即使该队列是持久化的,一旦连接关闭或者客户端退出,该队列都会被自动删除,这种队列适用于一个客户端同时发送和读取消息的应用场景。
auto_delete设置是否自动删除。为true则设置队列为自动删除。自动删除的前提是:至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除。不能把这个参数错误的理解为:"当连接到此队列的所有客户端断开时,这个队列自动删除",因为生产者客户端创建这个队列,或者没有消费者客户端与这个队列连接时,都不会自动删除这个队列。arguments设置队列的其他一些参数,如 x-message-ttl、x-expires、x-max-length。
queue_bind 方法详解
def queue_bind(self, queue, exchange, routing_key=None, arguments=None):
queue队列名称。exchange交换器的名称。routing_key用来绑定队列和交换器的路由键。arguments定义绑定的一些参数。
basic_publish 方法详解
def basic_publish(self, exchange, routing_key, body, properties=None, mandatory=False, immediate=False):
exchange交换器的名称,指明消息需要发送到哪个交换器。如果设置为空字符串,则消息会被发生到RabbitMQ默认的交换器中。routing_key路由键,交换器根据路由键将消息存储到相应的队列之中。properties消息的基本属性集,其包含 14 个属性成员,分别有contentType、deliveryMode、proiotity等。body消息体payload,真正需要发送的消息。mandatory当参数设置为true时,交换器无法根据自身的类型和路由键找到一个符合条件的队列,那么RabbitMQ会调用Basic.Return命令消息返回给生产者。当参数设置为false时,出现上述情况,则消息直接丢失。immediate当参数设置为true时,如果交换器在将消息路由到队列时发现队列上并不存在任何消费者,那么这条消息将不会存入队列中。当与路由键匹配的所有队列都没有消费者时,该消息会通过Basic.Return返回至生产者。
basic_consume 方法详解
def basic_consume(self, consumer_callback, queue='', no_ack=False, exclusive=False, consumer_tag=None, arguments=None):
consumer_callback设置消费者的回调函数。用来处理RabbitMQ推送过来的消息,比如:DefaultConsumer,使用时需要客户端重写其中的方法。queue队列的名称。no_ack设置是否自动确认。建议设置成false,即不自动确认。exclusive设置是否排他。consumer_tag消费者标签,用来区分多个消费者。arguments设置消费者的其他参数。
exchange_type 模式
fanout 模式
- 任何发送到
fanout exchange的消息都会被转发到与exchange绑定的所有的queue上。 - 不需要指定
routing_key, 即使指定了也是无效的。 - 需要提前将
exchange与queue进行绑定, 一个exchange可以绑定到多个queue, 一个queue也可以同多个exchange进行绑定。 - 接收到消息的
exchange没有与任何queue绑定, 则消息就会被抛弃。
direct 模式
- 发送到
direct exchange的消息都会被转发到routing_key中指定的queue。 - 不需要将
exchange进行任何绑定操作。当然也可以进行绑定操作,可以将不同的routing key与不同的queue进行绑定,不同的queue与不同exchange进行绑定。 - 消息需要传递一个
routing_key。 - 如果消息中不存在
routing_key中绑定的队列名,则该消息就会被抛弃。 - 如果一个
exchange声明为direct,并且绑定中指定了routing_key,那么发生消息时。需要同时指明该exchange和routing_key。
topic 模式
- 这种模式比较复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个
routing_key,exchange会将消息转发到所有关注主题能与routing_key模糊匹配的队列。 - 需要
routing_key要提前绑定exchange与queue。 - 在进行绑定的时候,要提供一个该队列关心的主题,如:"#.log.#" 表示该队列关心所涉及 log 的消息(一个 routing_key 为 "MQ.log.error" 的消息会被转发到该队列)。
- "#" 表示 0 个或若干个关键字,"" 表示一个关键字。如 "log." 能与 "log.warn.timeout" 匹配,但是 "log.#" 能与上述匹配。
- 如果
exchange没有发现能够与routing_key匹配的Queue,则会抛弃此消息。
RabbitMQ 相关概念和方法详解的更多相关文章
- session的使用方法详解
session的使用方法详解 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器 ...
- Kooboo CMS - Html.FrontHtml[Helper.cs] 各个方法详解
下面罗列了方法详解,每一个方法一篇文章. Kooboo CMS - @Html.FrontHtml().HtmlTitle() 详解 Kooboo CMS - Html.FrontHtml.Posit ...
- HTTP请求方法详解
HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源] GET方法用来请求已被URI识别的资源.指定 ...
- ecshop后台增加|添加商店设置选项和使用方法详解
有时候我们想在Ecshop后台做个设置.radio.checkbox 等等来控制页面的显示,看看Ecshop的设计,用到了shop_config这个商店设置功能 Ecshop后台增加|添加商店设置选项 ...
- (转)Spring JdbcTemplate 方法详解
Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- windows.open()、close()方法详解
windows.open()方法详解: window.open(URL,name,features,replace)用于载入指定的URL到新的或已存在的窗口中,并返回代表新窗口的Win ...
- CURL使用方法详解
php采集神器CURL使用方法详解 作者:佚名 更新时间:2016-10-21 对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程 ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
随机推荐
- tensorflow中创建多个计算图(Graph)
tf程序中,系统会自动创建并维护一个默认的计算图,计算图可以理解为神经网络(Neural Network)结构的程序化描述.如果不显式指定所归属的计算图,则所有的tensor和Operation都是在 ...
- 51nod1680 区间求和
有n个数,给定一个k,求所有长度大于等于k的区间中前k大数的总和.这样就比较简单相信大家都会,所以此题要求当k=1~n的总和,即求 ∑nk=1∑n−k+1i=1∑nj=i+k−1 区间前K大和 In ...
- Linux 优秀软件
本文由Suzzz原创,发布于 http://www.cnblogs.com/Suzzz/p/4038925.html ,转载请保留此声明 一些Linux下的优秀软件,个人非常喜欢.都在Ubuntu14 ...
- jslint报错太多的解决方式
当jslint 一个js的时候,有时候太多“错误”,导致报错:“Too many errors. (53% scanned).”而停止检查 js文件,此时我们还是想把整个js文件检查完毕的. 所以,看 ...
- PHP实现图片压缩的两则实例(转)
本文介绍了PHP实现图片压缩的两种方法,读者可以根据具体应用参考或加以改进,以适应自身应用需求!废话不多说,主要代码部分如下: 实例1: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- bzoj 3028 食物——生成函数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3028 把式子写出来,化一化,变成 x / ((1-x)^4) ,变成几个 sigma 相乘的 ...
- 安装CenOS7.4 LNMP环境
从头开始安装环境 1.在vmware中安装最新的CentOS7.4 linux版本下载地址:http://man.linuxde.net/download/ 下载好的东东为:iso后缀的文件 安装教程 ...
- Dubbo入门之一:实例1
原文地址:http://blog.csdn.net/ruishenh/article/details/23180707?utm_source=tuicool 1. 概述 Dubbo是一个分布式服务 ...
- Python打造一个目录扫描工具
目标:用Python3写一款小型的web目录扫描工具 功能:1.扫描指定站点 2.指定网站脚本类型来扫描 3.可控线程 4.可保存扫描结果 首先定义一个命令参数的函数 def parse_option ...
- 问题:oracle字符串函数;结果:Oracle字符串函数
Oracle字符串函数 最近换了新公司,又用回Oracle数据库了,很多东西都忘记了,只是有个印象,这两晚抽了点时间,把oracle对字符串的一些处理函数做了一下整理,供日后查看.. 平常我们用Ora ...