掌握Rabbitmq几个重要概念,从一条消息说起
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几个重要概念,从一条消息说起的更多相关文章
- rabbitmq 延时队列 插件方式实现 每条消息都延时自己时间
上篇文章的延时是加到队列上的 通过死信过时推送 ,缺点就是不能每条消息定义自己的过时时间而且每次有新的过时时间,要新建一个交换机和队列 https://www.cnblogs.com/brady-wa ...
- 消息中间件系列二:RabbitMQ入门(基本概念、RabbitMQ的安装和运行)
一.基本概念 1. AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议.支持不同语言和不同的产品 2. 生产者 ...
- [转]RabbitMQ入门教程(概念,应用场景,安装,使用)
原文地址:https://www.jianshu.com/p/dae5bbed39b1 RabbitMQ 简介 RabbitMQ是一个在AMQP(Advanced Message Queuing Pr ...
- RabbitMQ的高级特性概念理解
1.RabbitMQ中的消息如何保障百分之百的投递成功? 答:百分之百的投递成功,方案可以参考下面的2.3. 2.什么是生产者端的可靠性投递? 答:第一步,生产者保障消息的成功发出.第二步,保障Rab ...
- RabbitMQ 入门之基础概念
什么是消息队列(MQ) 消息是在不同应用间传递的数据.这里的消息可以非常简单,比如只包含字符串,也可以非常复杂,包含多个嵌套的对象.消息队列(Message Queue)简单来说就是一种应用程序间的通 ...
- SpringBoot RabbitMQ 注解版 基本概念与基本案例
前言 人间清醒 目录 前言 Windows安装RabbitMQ 环境工具下载 Erlang环境安装 RabbitMQ安装 RabbitMQ Web管理端安裝 RabbitMQ新增超级管理员 Rabbi ...
- 【RabbitMQ】RabbitMQ的一些基础概念
工作中使用的是RabbitMQ,需要对其进行熟悉.使用之前,弄清楚它是什么东西,解决什么问题. 场景 一些不必实时执行的任务 开发中,有一些任务并无须实时执行,比如: 会员更新个人信息,更新会员信息之 ...
- rabbitmq系列(一)-基本概念理解
1.简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue protocol)的开源实现.AMQP高级消息队列,说白了就是一个开源的消息中间件.它能解决 ...
- 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列
原文:https://mp.weixin.qq.com/s/lpsQ3dEZHma9H0V_mcxuTw 一.资料文档 二.开发语言 三.支持的协议 四.消息存储 五.消息事务 六.负载均衡 七.集群 ...
随机推荐
- 记一次mysql数据库被勒索(下)
背景: nextcloud的mysql数据库被黑,删库勒索.参考:记一次mysql数据库被勒索(上) mysql数据库恢复成功,nextcloud还是无法连接.参考:记一次mysql数据库被勒索(中) ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 控制反转搭配简单业务
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 说明 我们上一节已经成功通过 连接提供程序存储库,获取到了 连接提供程序,但是连接提供程序和数据库连接依赖太深, ...
- 深入理解 Java 内存模型 JMM 与 volatile
Java 内存模型(Java Memory Model,简称 JMM)是一种抽象的概念,并不真实存在,它描述的是一组规范或者规则,通过这种规范定义了程序中各个变量(包括实例字段.静态字段和构成数组对象 ...
- 关于haar特征的理解及使用(java实现)
Haar特征原理综述Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征.它分为三类:边缘特征.线性特征.中心特征和对角线特征.如下所示: Haar-like矩形特征拓展 Lienha ...
- linux驱动之模块化编程小总结
本文包含了linux驱动模块化编程的基本,包括创建多线程,延时,以及makefile 以一个实例来说明 #include<linux/init.h> #include<linux/m ...
- Vue管理系统前端系列四组件拆分封装
目录 组件封装 首页布局拆分后结构 拆分后代码 状态管理中添加 app 模块 组件封装 在上一篇记录中,首页中有太多的代码,为了避免代码的臃肿,需要对主要的功能模块拆分,来让代码看起来更简洁,且能进行 ...
- ubuntu 本地源搭建
1.软件包放在 deps 目录下: dpkg-scanpackages deps /dev/null |gzip > deps/Packages.gz -r 2.更新 sources.list ...
- 牛客网PAT练兵场-程序运行时间
题解:无(注意下四舍五入和输出格式即可) 题目地址:https://www.nowcoder.com/questionTerminal/fabbb85fc2d342418bcacdf0148b6130 ...
- (新手向)N皇后问题详解(DFS算法)
非常经典的一道题: N皇后问题: 国际象棋中皇后的势力范围覆盖其所在的行.列以及两条对角线,现在考察如下问题:如何在n x n的棋盘上放置n个皇后,使得她们彼此互不攻击 . 免去麻烦我们这里假定n不是 ...
- C#串口通讯,复制粘贴就可用,仅仅介绍怎样最快的搭建一个串口通讯,异常拦截等等需要自己加上
using System; using System.Collections.Generic; using System.IO.Ports; using System.Text; //串口通讯类 pu ...