前文我们学习了 MQ的相关知识,现在我们来学习一下实现了AMQP协议的 rabbitMQ 中间件。rabbitMQ 是使用 erlang 语言编写的中间件(erlang之父 19年4月去世的,很伟大一个程序员)。

rabbitMQ 的结构和的角色

学习rabbtMQ我们先要弄清楚这几个概念:exchange,queue,routing-key,binding-key,message,publisher,exchange,binding-key,Connection,Channel,consumer,broker;下面对这些角色概念进行介绍。

消息的发送方被称作publisher(生产者),而消息的接收方被称作consumer(消费者),而消息队列服务器实体就是broker(指rabbitMQ);消费者或者生产者对rabbitMQ的一个连接被称作Connection(连接),在rabbit的连接模型中,为了提高连接传输效率,采用了Channel(管道)这种方式实现多路复用,类似于Nio中的模型;我们知道建立一个TCP连接代价很大,因此TCP连接建立后最好不要断开Connection-Channel连接模型就是为了达到这种目的;一个消费者(生产者)使用一个channel消费(发送)消息,而多个Channel共用一个Connection

一个生产者向rabbit投递消息,然后消费者消费这个消息的过程是这样的——生产者将消息投递给rabbit,在rabbit中exchange(交换机)首先会接收到这个消息,交换机相当于一个“分拣员”的角色,负责分拣消息,将这些消息存储到和自己绑定的queue(队列)中去,然后和队列绑定的消费者会消费这些消息。队列和交换机绑定通过一个binding-key(绑定键)来标记,而生产者投递消息给交换机的时候会指定一个routing-key(路由键),而交换机会根据路由和绑定键来判断将消息放到那些队列中去(扩展:kafka的数据是存储在 exchange 中,它的 queue 只是逻辑队列)。

图一是rabbitMQ的一个概念简图:



图一:rabbitMQ 概念简图

rabbitMQ交换机类型

在rabbit中交换机共有四种类型,下面对其类型和其消息路由规则做说明:

  • direct exchange(直连交换机):消息中的routing-key如果和binding-key一致, 交换器就将消息发到对应的队列中,routing-key要与binding-key完全匹配。
  • fanout exchange(扇型交换机):扇型交换机会将交给自己的消息发到所有和自己绑定的队列中去,它不会去匹配routing-keybinding-key
  • topic exchange(主题交换机):主题交换机的routing-key匹配binding-key的方式支持模糊匹配, 以.分割单词,*匹配一个单词,#匹配多个单词,比如如路由键是com.muggle.first 能被com.#*.muggle.*绑定键匹配。
  • headers exchange(头交换机):类似主题交换机,但是头交换机使用多个消息属性来代替路由键建立路由规则。通过判断消息头的值能否与指定的绑定相匹配来确立路由规则。当交换机的x-match属性为any时,消息头的任意一个值被匹配就可以满足条件,当为all的时候,就需要消息头的所有值都匹配成功,这种交换机在实际生产中用的并不多。

在实际生产中,我们可以选择不同交换机类型来灵活的配置我们的生产者和消费者之间消息的消费关系。如延时队列,消息广播等的功能。


作者:muggle 点我关注作者

出处:https://muggle-book.gitee.io/

版权:本文版权归作者所有

转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

点击关注我的博客

MQ系列(1)——rabbitMQ简介的更多相关文章

  1. 【SpringBoot MQ 系列】RabbitMq 核心知识点小结

    [MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...

  2. 【SpringBoot MQ 系列】RabbitListener 消费基本使用姿势介绍

    [MQ 系列]RabbitListener 消费基本使用姿势介绍 之前介绍了 rabbitmq 的消息发送姿势,既然有发送,当然就得有消费者,在 SpringBoot 环境下,消费可以说比较简单了,借 ...

  3. 我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比(转载)

    转载自:https://www.sojson.com/blog/48.html 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道.以管道的方式做消息传递. 场景: ...

  4. 为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比

    原文:https://www.sojson.com/blog/48.html 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道.以管道的方式做消息传递. 场景: ...

  5. RabbitMQ系列(一)rabbitmq简介

    ------------恢复内容开始------------ 参考:https://www.cnblogs.com/vipstone/p/9275256.html RabbitMQ简介 在介绍Rabb ...

  6. SpringBoot系列之RabbitMQ使用实用教程

    SpringBoot系列之RabbitMQ使用实用教程 @ 目录 1. 消息队列概述 1.1 MQ的概述 1.2 MQ目的地形式 2. 消息队列实现方式 2.1 常见MQ框架 2.2 MQ实现方式 3 ...

  7. 《吃透MQ系列》核心基础全在这里了

    这是<吃透XXX>技术系列的开篇,这个系列的思路是:先找到每个技术栈最本质的东西,然后以此为出发点,逐渐延伸出其他核心知识.所以,整个系列侧重于思考力的训练,不仅仅是讲清楚 What,而是 ...

  8. 《吃透MQ系列》之扒开Kafka的神秘面纱

    大家好,这是<吃透 MQ 系列>的第二弹,有些珊珊来迟,后台被好几个读者催更了,实属抱歉! 这篇文章拖更了好几周,起初的想法是:围绕每一个具体的消息中间件,不仅要写透,而且要控制好篇幅,写 ...

  9. RabbitMQ简介

    AMQP简介 在了解RabbitMQ之前,首先要了解AMQP协议.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消 ...

  10. MQ选型之RabbitMQ

    RabbitMQ是部署最广泛的开源消息代理.[官方原话] 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列(message queue),队列我们可以理解为管道.以管道的方式做消息传递. ...

随机推荐

  1. Spring Boot 教程 (3) - RESTful

    Spring Boot 教程 - RESTful 1. RESTful风格 1.1 简介与特点 RESTful是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式 ...

  2. C++98/11/17表达式类别

    目标 以下代码能否编译通过,能否按照期望运行?(点击展开) #include <utility> #include <type_traits> namespace cpp98 ...

  3. Python之日志处理(logging模块二实战)

    实战篇 import logging import logging.handlers LOG_PATH = r'./' def logConfig_1(): ''' 配置 log 输出到文件 : fi ...

  4. mysql中 Rank、DENSE_RANK()的区别

    相同点:RANK()和DENSE_RANK()的是排名函数 不同点:RANK()是跳跃排序,即如果有两条记录重复,接下来是第三级别 如:1 2 2 4,会跳过3 DENSE_RANK()是连续排序,即 ...

  5. PIC单片机的i2c的程序

    #include<pic.h>#define uchar unsigned char#define uint unsigned int#define add 0xaa__CONFIG(0x ...

  6. [Objective-C] 011_数据持久化_NSKeyedArchiver

    在日常开发中对于NSString.NSDictionary.NSArray.NSData.NSNumber这些基本类的数据持久化,可以用属性列表的方法持久化到.plist 文件中.但是一些我们自定义的 ...

  7. @Spring Boot程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码

    前言 这篇其实是对一年前的一篇文章的补坑. @Java Web 程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码 当时,就是在spring mvc应用里定义一个 ...

  8. C# 委托浅析

    C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变. 委托(Delegate)特别用于实现 ...

  9. Cocos Creator 通用框架设计 —— 资源管理优化

    接着<Cocos Creator 通用框架设计 -- 资源管理>聊聊资源管理框架后续的一些优化: 通过论坛和github的issue,收到了很多优化或bug的反馈,基本上抽空全部处理了,大 ...

  10. 50个SQL语句(MySQL版) 问题十四

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...