论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
大数据
›
数据仓库与分析
›
RabbitMQ详情
RabbitMQ详情
李优秀
金牌会员
|
2024-8-2 16:58:56
|
显示全部楼层
|
阅读模式
楼主
主题
577
|
帖子
577
|
积分
1731
一.MQ简介
什么是MQ
MQ本质是队列,FIFO先入先出,队列中存放的内容是message(消息),照旧一种跨历程的通讯机制,用于上卑鄙通报消息。在互联网架构中是常见的上卑鄙“逻辑解耦+物理解耦”的消息通讯服务。
重要用来实现流量削峰,应用解耦,异步处理等系统优化方案
为什么使用MQ
流量削峰:
比方:处理订单系统中能最大处理1万次订单,但在高峰期处理2万次订单处理不过来,只能限制1万次订单后的订单不能下单。那么有消息队列做缓冲就很好的解决这个问题,将这1秒内的订单分一段时间处理,意思没能处理的放在队列中等待直到处理完,这样比不能下单体验感好。
应用解耦:
在电商系统中有订单系统,库存系统,物流系统,支付系统,如果耦合调用它们任何一个子系统出故障下单会造成异常,这时使用消息队列后,用几分钟解决完故障后,继续处理订单,客户感受不到系统的故障,提升系统的可用性。
异步处理:
有些服务间是异步的
比方:A调用B,B花很长时间处理完,A不知道B什么时候处理完
以火线式解决:A过一段时间去调用B的API查询,或A提供一个callback api,B执行完调用API通知A服务。
使用消息总线后:A调用完B后,只需监听B处理完的消息,B处理完会发一条消息给MQ,MQ将此消息转发给A服务。
AMQP和JMS
MQ是消息通讯的模子,并发具体实现。现在实现MQ的有两种主流方式:AMQP、JMS。
两者间的区别和联系:
JMS是定义了同一的接口,来对消息操作进行同一;AMQP是通过规定协议来同一数据交互的格式
JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
JMS规定了两种消息模子;而AMQP的消息模子更加丰富
常见MQ产物
ActiveMQ:基于JMS
RabbitMQ:基于AMQP协议,erlang语言开发,稳固性好
RocketMQ:基于JMS,阿里巴巴产物,现在交由Apache基金会
Kafka:分布式消息系统,高吞吐量
二.RabbitMQ(消息队列)
选用RabbitMQ
在消息队列产物的选择上,我选用了RabbitMQ。估计有很多同砚质疑,为什么不选择Kafka呢?这里我必要表明几句。
消息队列产物有很多,比如说常见的有RocketMQ、RabbitMQ、ActiveMQ和Kafka。此中Kafka的性能是最好的,并发量比力大,而且消息收发的速度也非常快。但是消息收发的可靠性上,Kafka不如RabbitMQ,而且技术选型的时候执行速度并不是唯一标准。比速度的话,汇编语言碾压一切高级语言,但是现在我们写步调几乎不会选用汇编语言,而是要分身开发服从、易用性和生态圈。RabbitMQ还有另外一个杀手锏,那就是既支持消息异步收发,又支持同步收发,这个太牛了。虽然我们现在大部分的场景对应的是消息异步收发,但是有的场合要支持消息的同步收发,这时候RabbitMQ能顺应各种业务场景的优点就显现出来了。所以在项目立项的时候,选择RabbitMQ是最稳妥的方案。
RabbitMQ概念
RabbitMQ是由erlang语言开发的,基于AMQP协议完成的消息队列,是一种应用步调之间通讯是一个消息中间件,简单理解就是你发送一个包裹到快递站(RabbitMQ),然后这个快递站把包裹发送到目的地。RabbitMQ知识接收,存储,转发消息数据。
可靠性和可扩展性:
夸大 RabbitMQ 的可靠性特性,如消息持久化和消息确认机制,以确保消息不会丢失。
提及 RabbitMQ 的可扩展性,可以通过添加更多的节点和集群来处理大量的消息负载。
用途和优点:
提到 RabbitMQ 在分布式系统中的常见用途,如异步使命处理、事件驱动架构、微服务通讯等。
夸大 RabbitMQ 的优点,包括可靠性、机动的路由规则、丰富的功能和社区支持。
AMQP(高级消息队列协议):
AMQP(Advanced Message Queuing Protocol)是一种高级消息队列协议,用于在应用步调之间可靠地通报消息。它是一种开放标准协议,旨在提供同一的消息通报机制,使差别的应用步调或服务可以或许相互通讯。
以下是关于 AMQP 的一些要点:
标准化协议:
AMQP 是一个标准化协议,由多个加入者共同制定,此中最闻名的是 AMQP 0-9-1 版本。该协议定义了消息通报的格式、交换机和队列的行为,以及客户端和代理之间的通讯规则。
可靠性:
AMQP 提供可靠的消息通报机制,确保消息在传输过程中不会丢失。它通过持久化消息、确认机制和事件支持等特性来保证消息的可靠性。
机动的路由:
AMQP 提供了机动的消息路由机制。通过交换机和绑定的组合,可以将消息从生产者路由到一个或多个队列,以满意差别的消息通报需求。支持的交换机范例包括直连交换机、主题交换机、扇形交换机等。
消息持久化:
AMQP 允许消息进行持久化,即使在代理或系统故障后也能保存消息。这对于对消息通报的可靠性和持久性有告急意义。
多种编程语言支持:
AMQP 是一种协议,可以在多种编程语言中实现和使用。因此,您可以使用差别的编程语言来开发生产者和消费者,以便在差别的应用步调之间进行消息通报。
跨平台和云集成:
AMQP 可以在差别的操作系统和云平台上运行。这使得它成为构建分布式系统、微服务架构和云集成的理想选择。
消息过期时间:
默认环境消息是无穷期存储在Rabbitmq上面的,但是我们可以设置过期时间,到期后无论消息有没有被接受都会删除。
总的来说,AMQP 提供了一个通用的、可靠的消息通报协议,可以促进差别应用步调或服务之间的协作和通讯。它的设计目标是支持高性能、可扩展性和可靠性,而且在各种应用场景下得到广泛应用,包括金融服务、电子商务、物联网等。
ACK应答:
消费者接受消息时,必须返回一个Ack应答,Rabbitmq才会认为这条消息接收乐成。如果想删除这条消息,消费者发送Ack应答的时候,附带一个deliveryTag标志位就可以了
三种交换机:
直连交换机(Direct Exchange):
直连交换机是最简单的交换机范例之一。它根据消息的路由键(Routing Key)将消息路由到与之完全匹配的队列。当一个队列绑定到直连交换机时,必要指定一个绑定键(Binding Key),当消息的路由键与绑定键完全匹配时,消息会被路由到该队列。
主题交换机(Topic Exchange):
主题交换机根据消息的路由键与主题模式(Topic Pattern)进行匹配,并将消息路由到匹配的队列。主题模式可以使用通配符进行机动匹配,如使用“*”表现匹配一个单词,“#”表现匹配零个或多个单词。这使得主题交换机可以或许支持更机动的消息路由。
扇形交换机(Fanout Exchange):
扇形交换机将消息广播到全部绑定到它的队列,而不思量消息的路由键。当一个队列绑定到扇形交换机时,全部发送到该交换机的消息都会被复制并发送到该队列。扇形交换机通常用于实现消息的广播机制,将消息发送给全部订阅者。
这些交换机范例提供了差别的路由计谋,实用于差别的消息通报需求。根据具体的业务场景和消息的路由规则,您可以选择合适的交换机范例来实现消息的机动路由和分发。
焦点概念:
RabbitMQ 是一个开源的消息代理软件,它提供了一个消息通报系统,用于在差别的应用步调或服务之间交换数据。它基于高级消息队列协议(AMQP)构建,旨在高效处理大量的消息。
RabbitMQ 的焦点概念包括以下几个方面:
消息代理:
RabbitMQ 充当生产者(发送者)和消费者(接收者)之间的中间人。它接收来自生产者的消息,并根据定义的规则将它们路由到相应的消费者。
消息:
消息是 RabbitMQ 中的根本单元。它包含要通报的数据以及与该消息相关的元数据。消息可以是任何形式的数据,比方文本、JSON、XML 等。
队列:
队列是 RabbitMQ 用于存储消息的容器。当生产者发送消息时,消息起首进入队列,然后等待被消费者处理。队列遵循先进先出(FIFO)的原则,即最先进入队列的消息起首被消费。
交换机:
交换机是消息的分发中央,它接收来自生产者的消息并根据预定义的规则将其路由到一个或多个队列中。交换机的范例决定了消息的路由方式,常见的范例有直连交换机、主题交换机、扇形交换机等。
绑定:
绑定是交换机和队列之间的关联关系。它定义了消息在哪些队列上进行分发。一个队列可以绑定到一个或多个交换机上,一个交换机也可以绑定到一个或多个队列上。
消费者:
消费者是从队列中接收并处理消息的应用步调或服务。它订阅一个或多个队列,并等待消息的到达。一旦有消息可用,消费者就会处理它,并确认消息已经被消费。
通过使用 RabbitMQ,您可以实现差别应用步调或服务之间的松耦合通讯。生产者可以将消息发送到 RabbitMQ,而不必关心哪个具体的应用步调或服务会接收这些消息。消费者可以独立于生产者工作,并根据自己的需求从队列中接收消息。
同时,RabbitMQ 还提供了一些高级功能,如消息持久化、消息确认机制、消息优先级等,以及可扩展性和机动的路由配置,使您可以或许构建强盛而可靠的消息通报系统。
工作原理:
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作差别用户的权限分离。
producer:消息生产者,就是投递消息的步调。
consumer:消息消费者,就是接受消息的步调。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话使命。
生产者发送消息流程:
生产者与Broker建立TCP连接
生产者与Broker建立通道
生产者通过通道消息发送给Broker,由Exchange将消息进行转发
Exchange将消息转发到指定的Queue
消费者接收消息里流程:
消费者与Broker建立TCP连接
消费者与Broker建立通道
消费者监听指定的Queue(队列)
当有消息到达Queue时Broker默认将消息推送给消费者
消费者接收到消息
ack复兴
同步接收和异步接收
异步:
异步斲丧系统的资源较少,但是小步调和后端之间并不是长连接,所以后端项目异步方式接收到队列中的消息无法推送给移动端的小步调。小步调自带的消息推送机制,但是这个功能是有严酷限制的,有效期和推送次数做了限制。
同步:
可以通过java后端项目采取同步的方式接收队列中的消息。在移动端,我们创建定时器,然后向后端java项目发出轮询请求。后端java项目接收到轮询请求后,用同步的方式接收消息队列中的消息,然后把消息队列存储在MongoDB上面,最后向小步调返回接收了多少条新消息,移动端则弹出提示框告知用户消息的消息通知
三.五种消息模子:
简单模式
一个生产者只能对应一个消费者,中间用队列连接
work工作模式
多个消费者去消费队列里的消息,但是队列里的消息只能被一个消费者消费,多部署几个消费者,就可以缓解压力。
发布/订阅(pub/sub)模式
如果我们有一个国家气象局天气预告系统,这个时候他发送消息,其他的服务商,比如百度、网易、腾讯等公司都要从国家天气预告系统那边获取天气怎么办呢?总不能百度获取了今天的天气其他公司就获取不了天气了吧,或者让国家天气预告系统给每个服务商都发送一次消息,那样显然是很麻烦的。
所以我们必要用到一个Exchange交换机脚色来资助我们把消息发给全部订阅我们的服务商。
Routing路由模式
路由模式不是给全部订阅他的队列发消息,而是根据路由键来确定给谁人队列发消息,队列和交换机绑定时通过路由键,而生产者发消息时也必要指定路由键,这样就确定给谁人队列发消息了。
Topics通用模式
生产者将消息发送到Topic交换机,交换机按照复杂的给咱,把消息路由到某个队列中
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
李优秀
金牌会员
这个人很懒什么都没写!
楼主热帖
什么是API密钥及其安全利用指南? ...
【云原生 | 从零开始学Kubernetes】二 ...
【Java结业计划】基于JavaWeb的在线购 ...
基于GLM生成SQL,基于MOSS生成SQL,其 ...
Docker Compose - 安装和基本使用 ...
mac安装java17(jdk17)
亲测有效,彻底解决msvcr100.dll丢失的7 ...
2024年最恰当高级网工的11款Linux ...
[Qt][Qt 网络][下]具体讲解
Linux体系(CentOS)下安装设置 Nginx 超 ...
标签云
存储
服务器
浏览过的版块
Java
快速回复
返回顶部
返回列表