RabbitMQ基础概念(消息、队列、交换机)
1、消息的确认
RabbitMQ需要对每一条发送的消息进行确认。消费者必须通过AMQP的basic.ack命令显式地向RabbitMQ发送一个确认,或者在订阅到队列的时候就将auto_ack参数设置为true。当auto_ack为true时,一旦消费者接收消息,RabbitMQ会自动视其确认了消息。需要注意的是消费者对消息的确认和告诉生产者消息已经被接收了这两件事毫不相关。以此,消费者通过确认命令告诉RabbitMQ它已经确认地接收到消息,同时RabbitMQ才能安全的把消息从队列中删除。
如果消费者受到一条消息,然后确认之前从RabbitMQ断开连接(或者从队列上取消订阅),RabbitMQ会认为这条消息没有分发,然后重新分发给下一个订阅的消费者。如果你的应用程序崩溃了,这样做可以确保消息会被发送给另一个消费者处理。另一方面,如果应用程序有bug而忘记确认消息的话,RabbitMQ将不会给该消费者发送更多的消息。这是因为在上一条消息被确认之前,Rabbit会认为这个消费者没有准备好接收下一条消息。利用这一点,可以防止rabbit持续不断的消息涌向你的应用而导致过载。
在收到消息后,如果想要拒接而不是确认收到消息,有两种做法:
(1)、把消费者从RabbitMQ服务器断开连接,这会导致RabbitMQ自动重新把消息入队并发送给另一个消费者,这样做的好处是所有的RabbitMQ版本都支持。缺点是,这样的连接、断开连接的方式会额外增加RabbitMQ的负担。
(2)、如果使用的是RabbitMQ2.0.0或更高版本,可以使用AMQP的basic.reject命令。顾名思义:basic.reject允许消费者拒绝RabbitMQ发送消息。如果把reject命令的requeue设置为true的话,RabbitMQ会将消息重新发送给下一个订阅者。如果设置为false的话,RabbitMQ会立即把消息从队列中移除,而不会把它发送给新的消费者。
2、如何创建队列
RabbitMQ的消费者和生产者都能创建队列,通过queue.declare方法来创建。如果消费者在同一信道上订阅了一个队列,则它不能在声明队列,必须先取消订阅后,将信道置为传输模式。消费者订阅和绑定时都需要队列名,如果你创建队列时没有设置名字,rabbit会自动声明一个队列名称,并在queue.declare命令中返回。
如果你创建一个已经存在的队列,那么rabbit将不做任何事情。rabbit的queue.declare可以检测队列是否存在,如果队列存在,则返回成功,不存在则返回错误。
由生产者还是由消费者创建队列?答案是双向的,原因是消费者不能订阅不存在的队列,而发布者不能发布到消息不存在的队列,这有可能会造成消息的丢失。当然也可以通过其它方式来控制未发布的消息,而让消费者一端负责创建队列。
队列存在的意义:
(1)、为消息提供住所,消息再次等待消费
(2)、对负载均衡来说,队列是绝佳的方案。只需附加一堆消费者,并让RabbitMQ以循环的方式均匀地分配发来的消息
(3)、队列是RabbitMQ中消息的最后重点(除非消息进入黑洞)
3、交换器
路由键:消息绑定到交换器上的规则。
消息根据规则由交换机将消息投递到相对应的队列。如果路由消息不匹配任何绑定,消息将进入黑洞。
交换机有四种:direct、fanout、topic和header。其中headers和direct交换器完全一致,但性能比较差,很少用。
- direct交换器:如果路由键匹配,消息就会被投递到对应的队列。

服务器必须实现direct类型交换器,包括一个空白字符串命名的默认交换器。当声明一个队列时,它会自动绑定到默认交换器,并以队列名称作为路由键.
- fanout交换器:当发送一套消息到fanout交换器时,它会把消息投递给所有附加在此交换器上的队列。

- topic交换器:这类交换器可以使来自不同源头的消息能够达到同一队列。

备注:图片取网上
RabbitMQ基础概念(消息、队列、交换机)的更多相关文章
- RabbitMQ AMQP (高级消息队列协议)
目录 RabbitMQ AMQP (高级消息队列协议) Message Queue 简介 概念 基本组成 场景及作用 AMQP简介 模型架构 基础组件 AMQP-RabbitMQ 简介 模型 特性 参 ...
- 第二百九十二节,RabbitMQ多设备消息队列-Python开发
RabbitMQ多设备消息队列-Python开发 首先安装Python开发连接RabbitMQ的API,pika模块 pika模块为第三方模块 对于RabbitMQ来说,生产和消费不再针对内存里的一 ...
- 第二百九十一节,RabbitMQ多设备消息队列-安装与简介
RabbitMQ多设备消息队列-安装与简介 RabbitMQ简介 解释RabbitMQ,就不得不提到AMQP(Advanced Message Queuing Protocol)协议. AMQP协议是 ...
- RabbitMQ基础概念及使用
RabbitMQ RabbitMQ是什么? RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Message Q ...
- .NET 云原生架构师训练营(模块二 基础巩固 消息队列 介绍与基础)--学习笔记
2.6.1 消息队列 -- 介绍 主要使用场景 队列的三种形式 消息队列的优点 主要使用场景 典型的异步处理 流量削锋 应用解耦 队列的三种形式 点对点 工作队列 发布与订阅 消息队列的优点 1.屏蔽 ...
- RabbitMQ基础概念详细介绍
http://blog.csdn.net/column/details/rabbitmq.html 转至:http://www.ostest.cn/archives/497 引言 你是否遇到过两个(多 ...
- RabbitMQ (十六) 消息队列的应用场景 (转)
原贴 : http://blog.csdn.net/cws1214/article/details/52922267 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 ...
- RabbitMQ 基础概念进阶
上一篇 RabbitMQ 入门之基础概念 介绍了 RabbitMQ 的一些基础概念,本文再来介绍其中的一些细节和其它的进阶的概念. 一.消息生产者发送的消息不可达时如何处理 RabbitMQ 提供了消 ...
- rabbitMQ学习1:消息队列介绍与rabbitmq安装使用
1. 什么是消息队列 生活里的消息队列,如同邮局的邮箱, 如果没邮箱的话, 邮件必须找到邮件那个人,递给他,才玩完成,那这个任务会处理的很麻烦,很慢,效率很低 但是如果有了邮箱, 邮件直接丢给邮箱,用 ...
随机推荐
- OpenMPI源码剖析4:rte.h 头文件的说明信息
上一篇文章中说道,我们在 rte.h 中发现了有价值的说明: 我们一块一块来分析,首先看到第一块,关于 Process name Object: * (a) Process name objects ...
- 函数重载(overload)和函数重写(override)
1. 前言: 在C++中有两个非常容易混淆的概念,分别是函数重载(overload)和函数重写(overwirte).虽然只相差一个字,但是它们两者之间的差别还是非常巨大的. 而通过深入了解这两个概念 ...
- 【Machine Learning】如何处理机器学习中的非均衡数据集?
在机器学习中,我们常常会遇到不均衡的数据集.比如癌症数据集中,癌症样本的数量可能远少于非癌症样本的数量:在银行的信用数据集中,按期还款的客户数量可能远大于违约客户的样本数量. 比如非常有名的德国信 ...
- LeetCode - 326, 342, 231 Power of Three, Four, and Two
1. 问题 231. Power of Two: 判断一个整数是否是2的n次方,其中n是非负整数 342. Power of Four: 判断一个整数是否是4的n次方,其中n是非负整数 326. Po ...
- 敏捷冲刺Day1
前言: 之前的各种对教务系统的分析,再加上我们两三天的讨论和一个小时的站立会议,我们做出最终的决定.--我们决定换个项目主题,将原来的教务辅助系统换成现在的校园帮帮帮服务,并在之后会将完成后的计划书附 ...
- HDU 2148 Score
http://acm.hdu.edu.cn/showproblem.php?pid=2148 Problem Description 转眼又到了一年的年末,Lele又一次迎来了期末考试.虽然说每年都要 ...
- SQL 中 Date 与Datetime的区别
Date是SQL Server 2008新引进的数据类型.它表示一个日子,不包含时间部分,可以表示的日期范围从公元元年1月1日到9999年12月31日.只需要3个字节的存储空间. DateTime 日 ...
- mysql+navicat安装小结
1,mysql到官方下载,navicat下载破解版 2,修改my.ini, 注意,需要手动创建data文件夹, 其中C:\MySql\mysql-5.7.17-winx64是解压mysql的目录 [m ...
- 在select中,载入时默认select为空白,选项内不显示空白项
有两种办法,一种纯css实现,一种借助js实现. html: <body onload="load()"> <select id="abc" ...
- SSE:服务器发送事件,使用长链接进行通讯 基础学习
HTML5中新加了EventSounce对象,实现即时推送功能,可以从下面连接中学习, http://www.kwstu.com/ArticleView/kwstu_20140829064746093 ...