超详细的RabbitMQ入门与实战介绍,看这篇文章就够了!

V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

目录

  • 一、前情提示
  • 二、选择性订阅部分核心数据
  • 三、RabbitMQ的queue与exchange的绑定回顾
  • 四、direct exchange实现消息路由
  • 五、按需订阅数的代码实现
  • 六、更加强大而且灵活的按需订阅

一、前情提示

上一篇文章《教你面试的时候如何迅速完成90%以上的海量数据处理题》,我们已经给出了一整套的数据一致性的保障方案。

我们从如下三个角度,给出了方案如何实现。并且通过数据平台和电商系统进行了举例分析。

  • 核心数据的监控
  • 数据链路追踪
  • 自动化数据链路分析

目前为止,我们的架构图大概如下所示:

在这里插入图片描述

并且咱们之前对于这种架构下,如何基于MQ进行解耦的实现也做了详细的说明。

有不清楚的同学,可以具体看一下之前的三篇文章:

  1. 高并发+海量数据下如何实现系统解耦?【上】
  2. 高并发+海量数据下如何实现系统解耦?【中】
  3. 高并发+海量数据下如何实现系统解耦?【下】

那么这篇文章,我们就基于这个架构,在数据一致性方面做进一步的说明。同样,我们以RabbitMQ这个消息中间件来举例。


二、选择性的订阅部分核心数据

首先一个基于MQ实现的细节点就在于,比如对数据监控系统而言,他可能仅仅只是要从MQ里订阅部分数据来消费罢了。

这个是啥意思呢?因为比如实时计算平台他是会将自己计算出来的所有的数据指标都投递到MQ里去的。

但是这些数据指标可能是多达几十个甚至是几百个的,这里面不可能所有数据指标都是核心数据吧?

基本上按照我们过往经验而言,对于这种数据类的系统核心数据指标,大概就占到10%左右的比例而已。

然后对于数据查询平台而言,他可能是需要把所有的数据指标都消费出来,然后落地到自己的存储里去的。

但是对于数据监控系统而言,他只需要过滤出10%的核心数据指标即可,所以他需要的是有选择性的订阅数据。

咱们看看下面的图,立马就明白是什么意思了。

在这里插入图片描述

三、RabbitMQ的queue与exchange的绑定

不知道大家是否还记得之前讲解基于RabbitMQ实现多系统订阅同一份数据的场景。

我们采用的是每个系统使用自己的一个queue,但是都绑定到一个fanout exchange上去,然后生产者直接投递数据到fanout exchange。

fanout exchange会分发一份数据,绑定到自己的所有queue上去,然后各个系统都会从自己的queue里拿到相同的一份数据。

大家再看看下面的图回顾一下。

在这里插入图片描述

在这里有一个关键的代码如下所示:

在这里插入图片描述

也就是说,把自己创建的queue绑定到exchange上去,这个绑定关系在RabbitMQ里有一个专业的术语叫做:binding。


四、direct exchange实现消息路由

如果仅仅使用之前的fanout exchange,那么是无法实现不同的系统按需订阅数据的,如果要实现允许不同的系统按需订阅数据,那么需要使用direct exchange。

direct exchange允许你在投递消息的时候,给每个消息打上一个routing key。同时direct exchange还允许binding到自己的queue指定一个binding key。

这样,direct exchange就会根据消息的routing key将这个消息路由到相同binding key对应的queue里去,这样就可以实现不同的系统按需订阅数据了。

说了这么多,是不是感觉有点晕,老规矩,咱们来一张图,直观的感受一下怎么回事儿:

在这里插入图片描述

而且一个queue是可以使用多个binding key的,比如说使用“k1”和“k2”两个binding key的话,那么routing key为“k1”和“k2”的消息都会路由到那个queue里去。

同时不同的queue也可以指定相同的ruoting key,这个时候就跟fanout exchange其实是一样的了,一个消息会同时路由到多个queue里去。


五、按需订阅的代码实现

首先在生产者那块,比如说实时计算平台吧,他就应该是要定义一个direct exchange了。

如下代码所示,所有的数据都是投递到这个exchange里去,比如我们这里使用的exchange名字就是“rt_data”,意思就是实时数据计算结果,类型是“direct”:

channel.exchangeDeclare(

​ “rt_data”,

​ “direct”);

而且,在投递消息的时候,要给一个消息打上标签,也就是他的routing key,表明这个消息是普通数据还是核心数据,这样才能实现路由,如下代码所示:

在这里插入图片描述

上面第一个参数是指定要投递到哪个exchange里去,第二个参数就是routing key,这里的“common_data”代表了是普通数据,也可以用“core_data”代表核心数据,实时计算平台根据自己的情况指定普通或者核心数据。

然后消费者在进行queue和exchange的binding的时候,需要指定binding key,代码如下所示:

在这里插入图片描述

上面第一行就是在消费者那里,比如数据监控系统那里,也是定义一下direct exchange。

然后第二行就是定义一个"rt_data_monitor"这个queue。

第三行就是对queue和exchange进行绑定,指定了binding key是“core_data”。

如果是数据查询系统,他是普通数据和核心数据都要的,那么就可以在binding key里指定多个值,用逗号隔开,如下所示:

channel.queueBind(

​ “rt_data_query”,

​ “rt_data”,

​ “common_data, core_data”);

到这里,大家就明白如何对数据打上不同的标签(也就是routing key),然后让不同的系统按需订阅自己需要的数据了(也就是指定binding key),这种方式用到了direct exchange这种类型,非常的灵活。

最后,再看看之前画的那幅图,大家再来感受一下即可:

在这里插入图片描述

六、更加强大而且灵活的按需订阅

RabbitMQ 还支持更加强大而且灵活的按需数据订阅,也就是使用topic exchange,其实跟direct exchange是类似的,只不过功能更加的强大罢了。

比如说你定义一个topic exchange,然后routing key就需要指定为用点号隔开的多个单词,如下所示:

在这里插入图片描述

然后,你在设置binding key的时候,他是支持通配符的。 * 匹配一个单词,# 匹配0个或者多个单词,比如说你的binding key可以这么来设置:

在这里插入图片描述

这个product.*.* ,就会跟“product.common.data”匹配上,意思就是,可能某个系统就是对商品类的数据指标感兴趣,不管是普通数据还是核心数据。

所以到这里,大家就应该很容易明白了,通过RabbitMQ的direct、topic两种exchange,我们可以轻松实现各种强大的数据按需订阅的功能。

通过本文,我们就将最近讲的数据一致性保障方案里的一些MQ中间件落地的细节给大家说明白了。

V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

另外推荐儒猿课堂的1元系列课程给您,欢迎加入一起学习~

互联网Java工程师面试突击课(1元专享)

SpringCloudAlibaba零基础入门到项目实战(1元专享)

亿级流量下的电商详情页系统实战项目(1元专享)

Kafka消息中间件内核源码精讲(1元专享)

12个实战案例带你玩转Java并发编程(1元专享)

Elasticsearch零基础入门到精通(1元专享)

基于Java手写分布式中间件系统实战(1元专享)

基于ShardingSphere的分库分表实战课(1元专享)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340