RabbitMQ 是功能强大的开源消息代理。根据官网称:也是使用量最广泛的消息队列。就像他的口号“Messaging that just works”,开箱即用使用简单,支持多种消息传输协议(AMQP、STOMP、MQTT)。

一个应用程序或者服务如何使用RabbitMq呢?

首先会有生产者和消费者两个角色;生产者连接到rabbit代理服务,创建一条AMQP信道,然后把生成的消息,通过信道发布到交换器上,交换器根据路由规则(路由key)进行绑定到或者路由到队列上面。最后消息到达队列上中。消费者跟生产者一样需要先和rabbit代理服务器创建连接,同时创建一个消息管道,并订阅到队列上,进而从队列中获取消息,进行处理。这里面涉及到消息、交换器、绑定、队列几个重要的概念,下面会一一讲解。整个过程如图所示

消息

生产者创建消息,这里的消息是指?消息包含两个部分内容:有效载荷(payload)、标签(label)。有效载荷就是你想要传输的数据。而标签是描述了有效载荷,并且RabbitMQ用它来决定谁将获得消息的拷贝。其实通过上图你也会发现,不同于tcp协议,因为AMQP没有明确的接收方,只会用标签表述这条消息,然后把消息交给Rabbit。rabbit会根据标签把消息发送给感兴趣的接收方。

队列

消息最终到达队列中并等待消费。消费者通过AMQP的Basic.Consume命令订阅。这样做会将信道设置为接受模式,直到取消对队列的订阅为止。订阅之后,消费者在消费(或者拒绝)最近的接收的那条消息之后,就能从队列中自动的接收下一条消息。

注意:什么时候消息才会从队列中删除呢?这里涉及到一个消息确认的动作。消费者接收到的每一条消息都必须进行确认。才会从队列中删除。消费者可以通过AMQP的Basic.Ack命令显式地向rabbtmq发送一个确认,或者在订阅到队列的时候就将autoAck属性设置为true;如:autoAck: true,一旦消费者接收消息,rabbitmq会自动视其确认了消息。

如果消费者接收到消费1,然后在确认之前从rabbit断开连接,rabbitmq会认为这条消息没有分发,然后重新分发下一个订阅的消费者。这样做的好处,即使你的应用程序奔溃了,也可以确保消息会被发送给另一个消费者进行处理,或者等待你的程序恢复正常连接,继续消费。假设消费者A程序与rabbit断开了连接,消息进而会被消费者B进行消费处理。如下图

只要消费者不进行确认,rabbit将不会给该消费者发送消息,因为在上一条消息被确认之前,rabbit会认为这个消费者并没有准备好接收下一条消息的能力。

在没有办法正常确认消息,不能一直堵塞呀,比如消费者有bug。那就使用AMPQ的Basic.Reject命令;明确的拒绝这条消息,其中一个参数requeue如果设置了ture的话,Rabbit会把消息重新发给下一个订阅的消费者。

如果你检测到一条消息本身有错误而任何一个消费者都无法处理的时候,就可以把requeue设置为false,rabbitmq会把消息从队里中移除,而不会把他发送给新的消费者。

注意:这里你可以使用对拒绝的消息进行特殊处理,比如发送到死信队列或者专门收集的erro队里中。

小结:队列是amqp消息通信的基础模块

1.为消息提供的处所,消息在此等待消费
2.对负载均衡来说,队列是绝佳方案。只需附加一堆消费者,并让rabbitmq以循环的方式均匀地分配发来的消息。
3.队列是rabbit中消息的最后的终点。

交换器、绑定

我们知道消费者如何获取消息,那么现在的问题是,消息是如何到达队列的呢?消息发送到交换器,会根据确定的规则,RabbitMQ将会决定消息该投递到哪个队列。这些规则称为路由键(routing key)。队列通过路由键绑定到交换器。当你发送消息到代理服务器时,消息将拥有一个路由键。如:AMPQ的Basic.Publish方法,有个参数routingKey通过他指定。即便是空的,RabbitMQ也会将其和绑定使用的路由键进行匹配。

交换器有四种类型:direct、fanout、topic和headers;每种类型实现了不同的路由算法,前三个比较常用。

1.direct

这种模式非常简单:路由键匹配的话,消息就被投递到对应的队列。路由算法-使用路由键和队列名称同名进行路由消息。使用场景-直接把消息发送到指定队列时使用。

默认的direct交换器,不需要进行声明, 队列声明会自动绑定到默认的交换器上,并以队列名称作为路右键。使用以下代码发送消息申明的队列中。

channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: body);

2.fanout交换器

这种模式下,可以忽略routing key,唯一需要做的就是为新的消费者写一段代码,然后声明新的队列并将其绑定到fanout交换器上。当你发送一条消息到fanout交换器上,他会把消息投递给所有附加在此交换器的队里上。路由算法-消息会路由到绑定到交换器上的所有队列。使用场景-发布订阅的广播功能

2.topic交换器

这类交换器允许不同源头的消息到达同一个队列。路由算法-根据全部或部分路由键匹配将消息路由绑定的队列上。使用场景-根据某些条件广播到特定的队列上。

小结:

本文主要总结了 AMQP几个主要元素:交换器,绑定,队列。以及一个消息创建到消费者读取消费的过程。

掌握Rabbitmq几个重要概念,从一条消息说起的更多相关文章

  1. rabbitmq 延时队列 插件方式实现 每条消息都延时自己时间

    上篇文章的延时是加到队列上的 通过死信过时推送 ,缺点就是不能每条消息定义自己的过时时间而且每次有新的过时时间,要新建一个交换机和队列 https://www.cnblogs.com/brady-wa ...

  2. 消息中间件系列二:RabbitMQ入门(基本概念、RabbitMQ的安装和运行)

    一.基本概念 1. AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议.支持不同语言和不同的产品 2. 生产者 ...

  3. [转]RabbitMQ入门教程(概念,应用场景,安装,使用)

    原文地址:https://www.jianshu.com/p/dae5bbed39b1 RabbitMQ 简介 RabbitMQ是一个在AMQP(Advanced Message Queuing Pr ...

  4. RabbitMQ的高级特性概念理解

    1.RabbitMQ中的消息如何保障百分之百的投递成功? 答:百分之百的投递成功,方案可以参考下面的2.3. 2.什么是生产者端的可靠性投递? 答:第一步,生产者保障消息的成功发出.第二步,保障Rab ...

  5. RabbitMQ 入门之基础概念

    什么是消息队列(MQ) 消息是在不同应用间传递的数据.这里的消息可以非常简单,比如只包含字符串,也可以非常复杂,包含多个嵌套的对象.消息队列(Message Queue)简单来说就是一种应用程序间的通 ...

  6. SpringBoot RabbitMQ 注解版 基本概念与基本案例

    前言 人间清醒 目录 前言 Windows安装RabbitMQ 环境工具下载 Erlang环境安装 RabbitMQ安装 RabbitMQ Web管理端安裝 RabbitMQ新增超级管理员 Rabbi ...

  7. 【RabbitMQ】RabbitMQ的一些基础概念

    工作中使用的是RabbitMQ,需要对其进行熟悉.使用之前,弄清楚它是什么东西,解决什么问题. 场景 一些不必实时执行的任务 开发中,有一些任务并无须实时执行,比如: 会员更新个人信息,更新会员信息之 ...

  8. rabbitmq系列(一)-基本概念理解

    1.简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue protocol)的开源实现.AMQP高级消息队列,说白了就是一个开源的消息中间件.它能解决 ...

  9. 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    原文:https://mp.weixin.qq.com/s/lpsQ3dEZHma9H0V_mcxuTw 一.资料文档 二.开发语言 三.支持的协议 四.消息存储 五.消息事务 六.负载均衡 七.集群 ...

随机推荐

  1. asp.net core 应用docke部署到centos7

    前言 前期准备 win10 (不要安装hyper-V) VMware-Workstation-Pro/15.0 Xshell6 (非必需) VS2019 以上环境请自行安装 都是默认安装没什么可说的 ...

  2. node.js 模拟自动发送邮件验证码

    node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...

  3. 第1章 Hive入门

    第1章 Hive入门 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提 ...

  4. Java 8新特性(一):Lambda表达式

    2014年3月发布的Java 8,有可能是Java版本更新中变化最大的一次.新的Java 8为开发者带来了许多重量级的新特性,包括Lambda表达式,流式数据处理,新的Optional类,新的日期和时 ...

  5. python 向excel 插入图片

    这是工作中一个真实的需求. 要做gt excel 表,表中要插入图片. 1.要把图片resize 基本相同的大小. 2.通过一下脚本插入图片到excel #!/usr/bin/env python3 ...

  6. 从《三体》到“中美科技战”,3分钟理解“网络”D丝为什么要迎娶“算力”白富美

    摘要:在多维的世界里,高维的文明对于低维文明具有碾压的优势,而网络也正在从二维走向三维!网络硬件的竞争主要是“芯片+算法”. 从三体到中美科技战,理解网络与算力深度融合助力高维度竞争 1:对抗封锁,需 ...

  7. 轻松应对并发,Newbe.Claptrap 框架入门,第四步 —— 利用 Minion,商品下单

    接上一篇 Newbe.Claptrap 框架入门,第三步 —— 定义 Claptrap,管理商品库存 ,我们继续要了解一下如何使用 Newbe.Claptrap 框架开发业务.通过本篇阅读,您便可以开 ...

  8. 招新裁老,两面派互联网大厂,培训三个月,就拿15K,凭什么?

    看到一位朋友在发帖子求问:亲身经历,(如有谎言我名字倒过来写)一个大学同学18年毕业的.在兰州一个二本学的兽医农牧,毕业难找工作,去深圳一个机构培训了三个月吧,然后就去做大数据 算法了,然后又去做ja ...

  9. e3mall商城的归纳总结4之图片服务器以及文本编辑器

    一.图片服务器 --1.认识图片服务器 大家可能都知道在分布式架构中使用图片上传可能会导致文件存放在某一个项目,而我们的项目基本上都采用集群的方式 ,因此这样会导致图片的问题比较难以存放,在这里我们有 ...

  10. 虚拟机VmWare打开报错,错误提示:VMware Authorization Service is not running!

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing 说明:打开我的虚 ...