前文我们学习了 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-key和binding-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. js操作html的基本方法

    刚学了js操作html的基本方法,在写代码过程中,有很多格式不规范,忘记加双引号尤其重要,通常这 样的错误很容易范,并且这种错误很难找.随着代码学习量越来越多,很多写法容易搞混.今天记录一下,以便后期 ...

  2. 配置单机Kafka

    配置单机kafka 关闭selinux,开启防火墙9092端口 1.关闭selinux vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXT ...

  3. 多用户vps管理面板怎么安装,有没有好用的vps管理工具

    一.VPS安装VPSMate控制面板步骤 1.使用SSH连接到VPS.使用命令获取VPSMate安装包: wget   http://www.vpsmate.org/tools/install.py ...

  4. 数据库之 MySQL --- 数据处理 之 表操作、CRUD(六)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一. 表操作 创建数据库CREATE DATABASE demo-- 删除数据库DROP DATABAS ...

  5. 看不见远程新建git分支

    再网页上新建了一个git分支.然后在本地跑git branch -r(查看远程分支)/ git branch -a(查看所有分支)两个命令,都没有看到新建的那个分支.这是为啥呢??? 原因是因为:gi ...

  6. Java实现 蓝桥杯 算法提高 三角形

    算法提高 12-1三角形 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体.分别设计独立的函数计算三角形的周长.面积. ...

  7. Java实现 LeetCode 111 二叉树的最小深度

    111. 二叉树的最小深度 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,nu ...

  8. Java实现蓝桥杯有歧义的号码

    描述 小Hi参加了一场大型马拉松运动会,他突然发现面前有一位参赛者背后的号码竟然和自己一样,也是666.仔细一看,原来那位参赛者把自己号码帖反(旋转180度)了,结果号码999看上去变成了号码666. ...

  9. Java实现 洛谷 P1047 校门外的树

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = ...

  10. Java实现有理数的循环节

    1/7 = 0.142857142- 是个无限循环小数. 任何有理数都可以表示为无限循环小数的形式. 本题目要求即是:给出一个数字的循环小数表示法. 例如: 输入: 1,5 则输出: 0.2 输入: ...