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. 什么是消息队列 生活里的消息队列,如同邮局的邮箱, 如果没邮箱的话, 邮件必须找到邮件那个人,递给他,才玩完成,那这个任务会处理的很麻烦,很慢,效率很低 但是如果有了邮箱, 邮件直接丢给邮箱,用 ...
随机推荐
- 查看python中包的文档
核心命令:python -m pydoc 查询某包:python -m pydoc 包名 示例: C:\Users\xxx>python -m pydoc pydoc - the Python ...
- Python高级编程-序列化
在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: dict1 = {'name': 'Rob', 'age': 19, 'score': 90} 可以随时修改变量,比如把age改成 ...
- USACO 1.1.3 Friday the Thirteenth 黑色星期五
Description 13号又是一个星期5.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至 ...
- Python学习 - 入门篇1
前言 学习渠道:慕课网:Python入门 记录原因:人总归要向记忆低头[微笑再见.gif] 记录目标:形成简洁的知识点查阅手册 变量和数据类型 变量 赋值 在Python中,可以把任意数据类型赋值给变 ...
- win8安装Ubuntu14
概述: 1.复制安装镜像和启动文件到FAT32分区 2.查找出FAT32分区的分区号,修改启动配置文件 3.启动FAT32分区的安装镜像,开始安装 UEFI Win7/8/Ubuntu 硬盘安装Ubu ...
- iOS-根据两个经纬度计算相距距离
CLLocation *orig=[[[CLLocation alloc] initWithLatitude:[mainDelegate.latitude_self doubleValue] long ...
- js jQuery 判断跳转是手机还是电脑
<script type="text/javascript"> $(function () { var system = {}; var p = navigator.p ...
- 我爱C语言
各位同志们好,我是来自计算机系的谢畅,我是一个平时看起来高冷其实很逗比的人,我的爱好有很多但只是会一些基础比如游泳,篮球,听听音乐什么的.我的特长是弹吉他虽然弹得不是很溜,我还喜欢朗诵.刚开始我并不是 ...
- (转)Linux NUMA引发的性能问题
最近某客户的核心业务系统又出了翻译缓慢的情况.该问题在6月份也出现过,当时进行了一次调整. 我们首先来看下故障时间段的awr报告: 单纯的从TOP 5 event,基本上是看不出任何东西的,可能有人会 ...
- 通过设置窗体的AcceptButton属性,可以设置窗体的“接受”按钮,若此设计,则用户每次按下Enter键都相当于单击该按钮
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...