一篇小文带你走进RabbitMQ的世界

云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


说到消息中间件,大部分人的第一印象可能是Kafka。毕竟Kafka自问世以来,就顶着高并发,大流量的光环。当然了Kafka也不负众望,在大数据处理方面一直独领风骚。

这里想说说另一款同样优秀的消息中间件RabbitMQ。

选RabbitMQ还是Kafka

如果单机数据量没有到十万级以上,我觉得选哪个都OK,如果超过百万甚至到了千万级那么建议选择Kafka。

对了还有重要的一点,RabbitMQ支持事务,而Kafka不支持。所以如果你的业务系统要求支持事务,那么只能选RabbitMQ。这也是很多金融系统选择RabbitMQ作为消息中间件的原因。

RabbitMQ基本概念

先来说一下消息中间件的通用模型,所有的消息中间件的模型基本都是这样。

 

1

而RabbitMQ是基于AMQP协议实现的。模型大概是这个样子,如下图所示

 

2

重点关注中间两个框框,下面依次解读一下。

信道

建立TCP链接是一件很费时的事情,所以很多提供高并发服务的软件都支持TCP链接复用,比如HTTP协议的KeepAlive就是为了复用TCP链接准备的。所以RabbitMQ提出了信道的概念,一个TCP链接里面可以支持多个信道同时通信,以提高通信效率。如下图所示。

 

3

broker

一个启动的RabbitMQ实例,代表一个broker。

虚拟主机

虚拟主机可以理解成命名空间的概念,方便队列管理。

交换器

向RabbitMQ发送消息时,先把消息先发到交换器,再由交换器根据相关路由规则发到特定队列上。目前 RabbitMQ的交换器共四种类型:direct、fanout、topic、headers。

headers交换器: 匹配消息的header而不是路由键,除此之外headers交换器和direct交换器完全一致,但性能差很多,所以目前几乎不用。

direct交换器: 消息中的路由键(routing key)如果和Binding(绑定的概念后面会介绍)中的 binding key 一致, 交换器就将消息发到对应的队列中。direct模式是完全匹配的单播模式,也就是说路由键与队列名完全匹配,如果一个队列绑定到交换机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发“dog.puppy”的消息。如下图所示。

 

4

fanout交换器:每个发送到fanout交换器中的消息,不会去匹配路由键,而是直接把消息投递到所有绑定到fanout交换器上的队列中。类似一个广播站,会向所有收听广播的用户发送消息。对应到实际应用中,它允许你针对一个消息作不同操作,比如用户上传了一张新的图片,系统要同时对这个事件进行不同的操作,比如删除旧的图片缓存、增加积分奖励等等。这样就大大降低了系统之间的耦合度了。
如下图所示。

 

4

topic交换器:topic交换器和direct交换器有相似之处,它通过模式匹配的方式分发消息,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号#和符号。#匹配0个或多个单词,匹配至少一个单词。如下图所示。

 

5

绑定

将消息队列和交换器进行关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表,如下图所示:

 

6

集群及高可用

因为RabbitMQ是Erlang开发的,所以天生支持分布式。所谓的天生支持的意思就是不用像Kafka那样借助ZK来实现集群。

先来看一下典型的RabbitMQ集群架构图。

 

7

集群分为普通模式和镜像模式。另外RabbitMQ集群分为内存节点和磁盘节点,集群当中必须存在磁盘节点。内存节点就是将数据存储到内存中,读写效率会比较高;而磁盘节点是将数据存储到磁盘上面,可以持久化保存数据。

普通模式:默认的集群模式。所谓的普通模式就是,多台机器上启动多个Rabbitmq实例,每台机器启动一个实例。但是创建的queue,只会放在一个Rabbtimq实例上,每个实例都会同步queue的元数据。消费的时候,如果连接到了另外一个实例,那么那个实例会从queue所在实例上拉取数据过来。如果存放queue的节点挂掉,那么就不能提供服务了。所以这种方式并不是真正的高可用。

镜像模式:创建的queue,无论元数据还是消息都会存在于多个实例上,每次写消息到queue的时候,都会自动把消息同步到多个实例的queue里。任何一个节点挂掉后,其他节点可以继续提供服务。类似于Redis集群的哨兵模式。关于Redis的高可用部署方式,可以看我这篇文章。

元数据:

元数据主要包含四类,分别是

  • 队列元数据:队列名称及属性;
  • 交换器元数据:交换器名称、类型及属性
  • 绑定元数据:记录了如何将消息路由到队列的数据;
  • vhost元数据:为队列、交换器和绑定提供命名空间和安全属性的数据;

运维常用管理命令

启动
/sbin/rabbitmq-server

重启
/sbin/rabbitmqctl reset

停止
/sbin/rabbitmqctl stop

停止应用
/sbin//rabbitmqctl stop_app

查看RabbitMQ状态
/sbin/rabbitmqctl status

查看绑定
/sbin/rabbitmqctl list_bindings

查看交换器
/sbin/rabbitmqctl list_exchanges

查看已声明的队列
/sbin/rabbitmqctl list_queues

stop和stop_app 的区别

这里需要特别注意一下这两个命令的区别:由于 RabbitmMQ是用Erlang写的,Erlang有节点的概念,也就是在一个Erlang节点上,可以运行很多个Erlang应用,stop命令是使得整个Erlang节点停止工作,而stop_app则是使得当前应用停止工作,不会影响其它应用的正常运行。

总结

如果之前一直接触的Java开发的中间件,突然接触RabbitMQ,会有些许不适应。特别是对于RabbitMQ的集群部署及高可用的理解。不过了解之后会发现这只兔子还是很可爱的。毕竟存在就有存在的道理。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-07-17
本文作者:花括号MC
本文来自:“掘金”,了解相关信息可以关注“掘金”

原文链接

本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx高可用方案:keepalived+nginx vip 动态位移

文章目录一、部署总览常用命令1. 部署总览2. 常用命令二、软件安装配置2.1. 安装keepalived2.2. 安装nginx2.3. 配置静态文件三、测试3.1. 启动nginx3.2. 验证四、vip动态位移测试4.1. 140验证4.2. 141验证4.3. 140停止kp服务4.4. 141 验证4.5. 140 重新启动kp服务一、部署总览…

多角度分析平台即服务?PaaS的类型和用例

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 没有适合所有人的单一PaaS。即使云计算已经发展了10多年,但对云计算服务模型的定义仍然相当模糊。通常&#xff0…

未来,边缘计算的功能支柱是 Kubernetes

来源 | SDNLAB责编 | 寇雪芹头图 | 下载于视觉中国编者按在数字化转型时代,5G网络是一个飞跃。5G正在推动边缘计算的发展,而Kubernetes则是5G与边缘计算之间的粘合剂。云计算的十年云计算之于信息技术(IT)产业,就像石油之于汽车工业一样。云让…

如何在工作中快速成长?致工程师的10个技巧

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 作者 | 江建明 阿里巴巴高级无线开发专家 导读:精英人数的增长速度持续加快后,很多人开始焦虑&#…

在新项目中使用 Vue3 使用总结

一、使用背景 最近公司需要搭建一个新项目,用于做官网。因为作为官网,首先项目不算大,一共只有十来个页面,并且想要用户体验感很好,所以最终选定以 Vue 作为技术栈。 虽然 Vue3 (中文官网)刚问…

2020年从架构谈起到Mesh结束

作者 | 张羽辰(同昭)阿里云交付专家 导读:如今,几乎所有的事情都离不开软件,当你开车时,脚踩上油门,实际上是车载计算机通过力度感应等计算输出功率,最终来控制油门,你从…

Mendix:低代码平台四大常见用例开发

编辑 | 宋慧 供稿 | Mendix 头图 | 付费下载于视觉中国 如今,低代码对很多人来讲可能已经不再是一个陌生的名词。创新的低代码开发平台实现了低级别编码的抽象化和人工流程的自动化。低代码通过可视化开发工具和可重用组件,缩短了定制化网络和移动应用的…

下架已上线的小程序;2.设置不允许被用户搜索到

下架已上线的小程序: 登录微信开发者后台【设置】-【功能设置】-【暂停服务设置】-【暂停服务】,如图 设置小程序不允许被用户搜索到: 登录微信开发者后台【设置】-【功能设置】-【隐私设置】-【关闭】,如图 操作过程中遇到的问题…

5G新基建边缘计算乘风破浪

2019年6月6日,工信部向中国电信、中国移动、中国联通、中国广电发放5G商用牌照,这意味着中国正式进入5G元年。一年以来,随着基站的建设与用户认知的提升,5G应用如雨后春笋般涌现。而在今年上半年频繁被提及的“新基建”中&#xf…

那些年,我在阿里当数据开发

前言: -更多关于数智化转型、数据中台内容请加入阿里云数据中台交流群—数智俱乐部 (文末扫描二维码或点此加入) -阿里云数据中台官网 https://dp.alibaba.com/index (作者:数据从业者 ) 我是阿里数据部…

太白金星:我很关心分布式 Quorum NWR

来源 | 悟空聊架构责编 | 寇雪芹头图 | 下载于视觉中国先来看一段神秘的对话:太白金星:听闻老君最近在练神丹妙药,可否与我一讲?太上老君:老白啊,我最近在练六颗丹药:两颗延年丹、两颗健步丹、两…

mPaaS小程序技术架构深度解析

⚅ 点击观看《mPaaS 小程序新品发布会》回放 > > 随着小程序技术的愈发成熟,不同平台的优势和典型使用场景各有侧重,同时越来越多的开发者可以结合自身的业务特色,通过小程序作为业务载体,形成单一平台或多平台的协同关系。…

从javaScript数据类型开始了解垃圾回收机制

一、 javaScript数据类型 javaScript 数据类型分为:基本数据类型、引用数据类型 基本数据类型 分类:Number、String、Boolean、Null、Undefined、Symbol。 存储地址:栈。 引用数据类型 分类:Object、Array、Function。 存储地…

直播中那几秒延时到底来自哪?

7月16日,亚太内容分发大会上,阿里云高级产品运营专家俞翔受邀出席,并分享了基于CDN网络构建超低延时直播的场景实践。以下为演讲原文。 近几年,直播带货已经逐渐走进大众视野。在今年上半年受疫情原因影响,直播营销市…

三探云原生全景图,这次聊聊运行时层

在《俯瞰云原生,这便是供应层》我们介绍了云原生全景图的最底层:供应层,本文将带大家了解运行时层,这一层包含了容器在云原生环境中运行所需的一切。作者 | Catherine Paganini,Jason Morgan来源 | K8sMeetup社区头图 …

SpringCloud应用在Kubernetes上的最佳实践—开发部署

作者 | 孤弋 阿里云高级技术专家,负责 EDAS 的开发和用户体验优化工作。 导读:在上一篇文章《SpringCloud 应用在 Kubernetes 上的云上实践 - 开发篇》中讲到可以通过两个工具,轻松地将一个 SpringCloud 应用从初始化到本地运行。本篇文章&a…

解决谷歌浏览器 google chrome 安装插件报错:Download interrupted,不支持 .crx 文件下载

最近给 新的 macBook Pro 2020 笔记本的 chrome 浏览器安装 react developer tools 时(翻墙情况下),安装总是不成功,有一个弹框提示:Download interrupted。 一开始我以为是第三方插件出了问题,于是我去安…

低代码,让人人都可以是开发者

作者:流水不争先 来源| 技术领导力(ID:jishulingdaoli)头图 | 下载于视觉中国今年2月23日,外国低代码平台提供商Creatio宣布获得6800万美元融资;2月22日,国内SaaS软件厂商黑湖智造宣布完成C轮近5亿元人民币融资。国内外…