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基础概念(消息、队列、交换机)的更多相关文章

  1. RabbitMQ AMQP (高级消息队列协议)

    目录 RabbitMQ AMQP (高级消息队列协议) Message Queue 简介 概念 基本组成 场景及作用 AMQP简介 模型架构 基础组件 AMQP-RabbitMQ 简介 模型 特性 参 ...

  2. 第二百九十二节,RabbitMQ多设备消息队列-Python开发

    RabbitMQ多设备消息队列-Python开发 首先安装Python开发连接RabbitMQ的API,pika模块 pika模块为第三方模块  对于RabbitMQ来说,生产和消费不再针对内存里的一 ...

  3. 第二百九十一节,RabbitMQ多设备消息队列-安装与简介

    RabbitMQ多设备消息队列-安装与简介 RabbitMQ简介 解释RabbitMQ,就不得不提到AMQP(Advanced Message Queuing Protocol)协议. AMQP协议是 ...

  4. RabbitMQ基础概念及使用

    RabbitMQ RabbitMQ是什么? RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Message Q ...

  5. .NET 云原生架构师训练营(模块二 基础巩固 消息队列 介绍与基础)--学习笔记

    2.6.1 消息队列 -- 介绍 主要使用场景 队列的三种形式 消息队列的优点 主要使用场景 典型的异步处理 流量削锋 应用解耦 队列的三种形式 点对点 工作队列 发布与订阅 消息队列的优点 1.屏蔽 ...

  6. RabbitMQ基础概念详细介绍

    http://blog.csdn.net/column/details/rabbitmq.html 转至:http://www.ostest.cn/archives/497 引言 你是否遇到过两个(多 ...

  7. RabbitMQ (十六) 消息队列的应用场景 (转)

    原贴 : http://blog.csdn.net/cws1214/article/details/52922267 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 ...

  8. RabbitMQ 基础概念进阶

    上一篇 RabbitMQ 入门之基础概念 介绍了 RabbitMQ 的一些基础概念,本文再来介绍其中的一些细节和其它的进阶的概念. 一.消息生产者发送的消息不可达时如何处理 RabbitMQ 提供了消 ...

  9. rabbitMQ学习1:消息队列介绍与rabbitmq安装使用

    1. 什么是消息队列 生活里的消息队列,如同邮局的邮箱, 如果没邮箱的话, 邮件必须找到邮件那个人,递给他,才玩完成,那这个任务会处理的很麻烦,很慢,效率很低 但是如果有了邮箱, 邮件直接丢给邮箱,用 ...

随机推荐

  1. Jedis 与 MySQL的连接线程安全问题

    Jedis的连接是非线程安全的 下面是set命令的执行过程,简单分为两个过程,客户端向服务端发送数据,服务端向客户端返回数据,从下面的代码来看:从建立连接到执行命令是没有进行任何并发同步的控制 pub ...

  2. hibernate提示Unknown entity: :xxx

    错误提示: org.hibernate.MappingException: Unknown entity: org.dao.po.Role at org.hibernate.internal.Sess ...

  3. 统计学习五:3.决策树的学习之CART算法

    全文引用自<统计学习方法>(李航) 分类与回归树(classification and regression tree, CART)模型是由Breiman等人于1984年提出的另一类决策树 ...

  4. eos智能合约开发最佳实践

    安全问题 1.可能的错误 智能合约终止 限制转账限额 限制速率 有效途径来进行bug修复和提升 2.谨慎发布智能合约 对智能合约进行彻底的测试 并在任何新的攻击手法被发现后及时制止 赏金计划和审计合约 ...

  5. 在 CentOS 下手工安装 Docker v1.1x

    Docker在 centos 6.x 下面默认最新的版本是1.7, 然而这个并不符合我的实际需求, 尤其我需要 docker-compose 来作为编配工具部署swarm, 所以我只有手工安装了. 首 ...

  6. canvas学习(一):线条,图像变换和状态保存

    canvas学习(一):线条,图像变换和状态保存 一:绘制一条线段: var canvas = document.getElementById('canvas') var ctx = canvas.g ...

  7. return语句的用法

    1.return语句的作用:a.返回一个值,这个值可以是任意类型.b.使程序返回到操作系统(即终止程序)2.java中对于一个函数,不论有没有返回值类型,都可以带有return 语句.但是区别在于,r ...

  8. ACM 第十一天

    多校7题目 GuGuFishtion Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  9. iOS- 多线程技术的概述及优点

    1.概述 在iOS开发中: •耗时操作,例如网络图片.视频.歌曲.书籍等资源下载 •游戏中的声音播放   我们可以利用多线程: •充分发挥多核处理器的优势,并发(同时执行)执行任务让系统运行的更快.更 ...

  10. JDK源码分析 – ArrayList

    ArrayList类的申明 ArrayList是一个支持泛型的,底层通过数组实现的一个可以存任意类型的数据结构,源码中的定义如下: public class ArrayList<E> ex ...