老规矩,本篇文章 不做 RabbitMQ 的 编码讲解 ,只介绍 文章学习的一些优秀文章

重点在于不要循规蹈矩,教程 这样走,你不一定要按他这样走,按自己的方式来,学习效率会更高,网上的教程有很多,今天我们找了一些自认为不错的

RabbitMQ 教程,先来讲讲RabbitMQ 的 基础 知识,如果对你有帮助,关注一下,防止迷路

RabbitMQ的基本概念

RabbitMQ github项目地址

RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的 消息中间件 之一。由以高性能、健壮以及可伸缩性出名的 Erlang 写成,因此也是继承了这些优点。并且RabbitMQ是一个是一个开源的消息代理和队列服务器。

AMQP : Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

环境

RabbitMQ 可以运行在 Erlang语言所支持的平台之上,包括:

  • Solaris :原先是太阳微系统公司研制的类Unix操作系统,在Sun公司被Oracle并购后被称作Oracle Solaris。
  • BSD : Berkeley Software Distribution,缩写为BSD,也被称为伯克利Unix(Berkeley Unix),是一个操作系统的名称。衍生自Unix(类Unix),1970年代由伯克利加州大学的学生比尔·乔伊(Bill Joy)开创
  • Linux : 是一种自由和开放源代码的类UNIX操作系统。该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布
  • MacOSX : 是苹果公司推出的图形用户界面操作系统,为麦金塔计算机专用,自2002年起在所有的Mac 计算机预装。
  • Windows :Microsoft Windows(中文译作微软视窗[4][5])是微软公司推出的一系列操作系统

使用 RabbitMQ 需要:

ErLang 语言包

下载地址:[http://www.erlang.org/downloads],双击.exe文件进行安装就好。

RabbitMQ 安装包

RabbitMQ Server官网下载地址

本文则主要集中在以下几点:

  • 几个基本概念(Message, Publisher, Exchange, Binding, Queue, Channel, Consuer, Virtual host)
  • 消息分发的几种策略
  • ACK是什么鬼

基本概念

消息队列 (Message QUEUE)

首先来一张消息队列的经典图,可以划分为三个角色: Producer, Queue, Consumer

  • Queue:为承载消息的容器,为什么是队列而不是栈呢?主要是因为绝大部分的场景,我们都是希望消息是先进先出,有顺序的
  • Producer:生产者,就是产生消息,并不断往队列塞的角色
  • Consumer:消费者,也就是不断从队列中获取消息的角色

看到这个模型,如果对JDK的容器有一定的了解,很容易可以想到借助 ArrayBlockingQueue 或者 ListBlockingQueue 就可以实现简易的消息队列(也就是我们常说的生产者-消费者模型)

实例理解消息队列

其实在生活中,这种模型用得非常多,就比如我们都会接触的网购快递,可以说是一个典型的消息队列的case了:

商家不断的把商品扔给快递公司(注意不是直接将商品给买家),而快递公司则将商品根据地质分发对应的买家

对上面这个过程进行拆解,可以映射扮演的角色

  • 商品:Message,传递的消息,由商家投递给快递公司时,需要进行打包(一般Producer生产消息也会将实体数据进行封装)
  • 商家:Produer 生产者
  • 快递公司: Queue,消息的载体
  • 买家:Consumer 消费者

那么快递公司时怎么知道要把商品给对应的买家呢?根据包裹上的地址+电话

  • 同样消息队列也需要一个映射规则,实现Message和Consumer之间的路由

RabbitMQ基本概念

通过上面的实例对比,发现基本的消息队列定义的元素太少,这里则正好可以看一下RabbitMQ是怎么具体来实现消息队列的

  • Message:消息,包含消息头(即附属的配置信息)和消息体(即消息的实体内容)
  • Publisher:生产者,向交换机发布消息的主体
  • Exchange:交换机,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
  • Binding:绑定,用于给Exchange和Queue建立关系,就是我们熟知的配对的红娘
  • Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
  • Connection:连接
  • Channel:通道,MQ与外部打交道都是通过Channel来的,发布消息、订阅队列还是接收消息,这些动作都是通过Channel完成;简单来说就是消息通过Channel塞进队列或者流出队列
  • Consumer:消费者,从消息队列中获取消息的主体
  • Virtual Host: 虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /
  • Broker:消息队列服务器实体

上面是一些专业的概念,那么可以怎么映射到前面的快递上呢?

Exchange类型

生产者,将消息投递给Exchange,然后由Exchange将消息路由到对应的Queue上,供消费者消费,那么这个路由有哪些方式呢?

1. Direct策略

消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中

简单来讲,就是路由键与队列名完全匹配

  • 如果一个队列绑定到交换机要求路由键为“dog”
  • 只转发 routing key 标记为“dog”的消息,
  • 不会转发“dog.puppy”,也不会转发“dog.guard”等等
  • 它是完全匹配、单播的模式

    举例说明

Exchange和两个队列绑定在一起:

  • Q1的bindingkey是orange
  • Q2的binding key是black和green.
  • 当Producer publish key是orange时, exchange会把它放到Q1上, 如果是black或green就会到Q2上, 其余的Message被丢弃

2 .Fanout策略

从上图也可以看出,这种策略,将忽略所谓的routing key,将消息分发到所有绑定的Queue上,更加类似我们理解的广播模式

3. Topic策略



topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上

可以理解为直接策略的进阶版,直接策略是完全精确匹配,而topic则支持正则匹配,满足某类指定规则的(如以xxx开头的路由键),可以键消息分发过去

  • # 匹配0个或多个单词
  • *匹配不多不少一个单词

一个更直观的实例如下

Producer发送消息时需要设置routing_key,

  • Q1 的binding key 是”.orange.“
  • Q2 是 “…rabbit” 和 “lazy.#”:
  • 产生一个 test.orange.mm 消息,则会路由到Q1;而如果是 test.orange则无法路由到Q1,因为Q1的规则是三个单词,中间一个为orange,不满足这个规则的都无效
  • 产生一个 test.qq.rabbit 或者 lazy.qq 都可以分发到Q2;即路由key为三个单词,最后一个为rabbit或者不限制单词个数,主要第一个是lazy的消息,都可以分发过来
  • 如果产生的是一个 test.orange.rabbit消息,则Q1和Q2都可以满足

4. Headers策略

这个实际上用得不多,它是根据Message的一些头部信息来分发过滤Message,忽略routing key的属性,如果Header信息和message消息的头信息相匹配

5. 小结

主要使用的消息分发策略有三个,直接,路由和扇形,简单的小结下应用场景和区别

a. Direct Exchange

直接完全匹配模式,适用于精准的消息分发

b. Topic Exchange

Routing Key的匹配模式,支持Routing Key的模糊匹配方式,更适用于多类消息的聚合

c. Fanout Exchange

忽略Routing Key, 将消息分配给所有的Queue,广播模式,适用于消息的复用场景

ACK

消息队列的一个重要指标,当有消费者获取了消息之后,对这个消息我应该怎么办?是直接删除还是等某个合适的机会再删除?又或者是干脆不删除,就留着了?

在实际的应用场景中,消息正常消费之后,我们希望的是这个消息就不要了,但是消费的过程中如果出现了bug,则希望不要删除消息,等我修复这个bug后,可以把这个消息重新的投递给我

  1. ack机制

Consumer接收到了消息之后,必须返回一个ack的标志,表示消息是否成功消费,如果返回true,则表示消费成功了,然后这个消息就会从RabbitMQ的队列中删掉;如果返回false,且设置为重新入队,则这个消息可以被重新投递进来

通常实际编码中,默认是自动ACK的,如果消息的重要性程度较高,我们应该设置为主动ACK,在接收到消息之后,自主的返回对应的ACK信息

这一块更多地内容可以查看实际使用篇


RabbitMQ 是个什么东西,大家都已经了解的差不多了,现在,我们来看看开始分享文章教程

RabbitMQ史上最全核心知识讲解

文章地址 :https://blog.csdn.net/qq_42292373/article/details/97498198

最全面透彻的RabbitMQ指南

文章地址 : https://www.jianshu.com/p/3e76a144bebd


史上最详细 RabbitMQ 详细讲解

文章地址: https://blog.csdn.net/weixin_38305440/article/details/102810522


RabbitMQ从入门到精通

文章地址 : https://blog.csdn.net/hellozpc/article/details/81436980


RabbitMQ 教学指南

文章有点偏理论化,但是拳拳到肉,讲到重点

文章地址 : https://www.cnblogs.com/zhangxiaoliu/p/7524846.html



好了,文章的推荐就到这里 谢谢大家

RabbitMQ史上最全文章的更多相关文章

  1. Redis史上最全文章教程

    Redis 2020 史上最详细Redis教程 本篇文章并不讲解Redis,只是收集 Redis的优质文章教程 ,文章包含三部分: 理论.编程实战 .面试题. 需要有一定编程功底的人学习 ,如果基础不 ...

  2. ElasticSearch 史上最全文章

    老规矩,本篇文章 不做 ElasticSearch 的 编码讲解 ,只介绍 文章学习的一些优秀文章 重点在于不要循规蹈矩,教程 这样走,你不一定要按他这样走,按自己的方式来,学习效率会更高,网上的教程 ...

  3. MyBatis史上最全文章

    老规矩,本篇文章 不做 MyBatis 的 编码讲解 ,只介绍 文章学习的一些优秀文章 重点在于不要循规蹈矩,教程 这样走,你不一定要按他这样走,按自己的方式来,学习效率会更高,网上的教程有很多,今天 ...

  4. 消息队列面试题、RabbitMQ面试题、Kafka面试题、RocketMQ面试题 (史上最全、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  5. 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结

    本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言   MySQL作为开源技术的代表作之一,是 ...

  6. nacos 实战(史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  7. TCP/IP协议 (图解+秒懂+史上最全)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  8. Java基础面试题(史上最全、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  9. HR面试:过五关斩六将后,小心阴沟翻船!(史上最全、避坑宝典)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

随机推荐

  1. 如何查看CDR文件是出自哪个版本?

    如何才能知道某个cdr文件用哪个版本的CorelDRAW软件打开?网上CorelDRAW软件有很多版本,都不知该下哪个了?这是我听到大家问道最多的问题,这是因为CDR低版本软件打不开高版本文件. 方法 ...

  2. Pytest自动化测试 - 必知必会的一些插件

    Pytest拥有丰富的插件架构,超过800个以上的外部插件和活跃的社区,在PyPI项目中以" pytest- *"为标识. 本篇将列举github标星超过两百的一些插件进行实战演示 ...

  3. Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree 题解(贪心+易错)

    题目链接 题目大意 给你一课树,要你给每一条边分权值,每条边的权值大于0,他们的乘积等于k,而且要使得n-1条边1的数量尽可能少,定义 f(u,v)为u到v的边权和求 \(\max \sum_{i=1 ...

  4. 关于transition动画效果中,滚动条会闪一下就消失的问题

    具体问题说明: 我在通过transition来改变width的长度,在transition变化过程中,底下的滚动条会闪烁一下. 问题原理:因为是里面容器没办法完全被装下,并且容器的宽度被限制住了. 解 ...

  5. HBase中Memstore存在的意义以及多列族引起的问题和设计

    Memstore存在的意义 HBase在WAL机制开启的情况下,不考虑块缓存,数据日志会先写入HLog,然后进入Memstore,最后持久化到HFile中.HFile是存储在hdfs上的,WAL预写日 ...

  6. 网络编程原理与UDP实现

    如何发送数据包? Q:当应用程序产生数据的时候,需要去构造数据包并发送到网络上去,但是由谁负责处理呢? A:现代操作系统负责数据包得构造与发送,应用程序只需提供数据. 当应用程序产生数据时,应用程序将 ...

  7. docker数据持久化/共享---volume,bind-mount,tmpfs-mount

    一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供 ...

  8. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

  9. PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件的checkable和checked属性

    checkable属性 checkable属性确认按钮是否可以被选中,缺省情况下该值为False,即按钮是不能被选中的. 可选择的按钮按下之后,按钮不会自动弹起来,此时按钮为选中状态,当再次点击按钮时 ...

  10. 自学linux——21. NFS服务器的搭建

    NFS服务器的搭建 1.NFS的认识 NFS(Network File System即网络文件系统)服务最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享文件,可以将远程 Linu ...