前文我们学习了 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. xshell使用技巧

    XShell是一款Windows下的一款远程连接Linux主机的工具,类似的软件还有SecureCRT,putty等,但是个人感觉XShell好用,功能强大.. 一.复制和粘贴 linux的Shell ...

  2. 简说Spring中的资源加载

    声明: 本文若有 任何纰漏.错误,请不吝指正!谢谢! 问题描述 遇到一个关于资源加载的问题,因此简单的记录一下,对Spring资源加载也做一个记录. 问题起因是使用了@PropertySource来进 ...

  3. [MSSQL] [EntityFramework(.Net Core)] 自增长id字段,无法插入数据

    IDENTITY_INSERT 为 OFF,无法插入数据, 类似的错误,解决记录: 网上查了下,都是 Code First 模式下的解决方案, 如:在 DBContext 的 OnModelCreat ...

  4. 初尝 Blazor WebAssembly

    一. 前言 Blazor 的整体介绍以及特点与优势,建议翻阅 Blazor 介绍. Blazor 是一个可是使用 .NET/C# 来编写交互式客户端的 Web UI 框架,在官网有一句话概括 &quo ...

  5. 派生类Student的构造函数和析构函数 代码参考

    #include <iostream> #include <cstring> using namespace std; class Person { private: char ...

  6. 用java方式实现快速排序

    一.基本思想 快速排序采用分治的策略,具体如下:选择一个关键值作为基准值,找到一个元素小于比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的).一般选用序列第一个元素作为基准 ...

  7. SpringBoot--SpringMVC自动配置

    SpringMVC自动配置 1.SpringBoot官方文档对SpringMVC的默认配置: Inclusion of ContentNegotiatingViewResolver and BeanN ...

  8. sku算法详解及Demo~接上篇

    前言 做过电商项目前端售卖的应该都遇见过不同规格产品库存的计算问题,业界名词叫做sku(stock Keeping Unit),库存量单元对应我们售卖的具体规格,比如一部手机具体型号规格,其中ipho ...

  9. HTML、CSS与JS实现简易iPhone计算器

    效果如图 源码,通俗易懂 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  10. Java实现 LeetCode 525 连续数组

    525. 连续数组 给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组(的长度). 示例 1: 输入: [0,1] 输出: 2 说明: [0, 1] 是具有相同数量0和1的最长连续 ...