当前位置: 首页 > news >正文

RabbitMQ的介绍

为什么使用 MQ?

  1. 流量削峰和缓冲
    如果订单系统最多能处理一万次订单,这个处理能力在足够应付正常时段的下单,但是在高峰期,可能会有两万次下单操作,订单系统只能处理一万次下单操作,剩下的一万次被阻塞。我们可以使用消息队列做缓冲,取消这个限制,把一秒内下的订单分散成一段时间来处理,减少了系统的压力,增强了用户的体验效果。

  2. 应用解耦
    不同的应用程序可以通过消息队列的方式解耦,生产者和消费者之间不需要直接相互通信,而是通过共享的消息队列进行通信。应用解耦使系统更灵活。

  3. 异步处理
    在秒杀任务中,大量用户下单时,将订单信息和库存信息保存在缓存中,之后使用消息队列的更改数据库中的数据。

几种MQ的对比:

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,REST,XMPP,AMQP自定义协议自定义协议
可用性一般
单机吞吐量一般非常高
消息延迟微秒级毫秒级毫秒级毫秒以内
消息可靠性一般一般

追求可用性:Kafka、 RocketMQ 、RabbitMQ

追求可靠性:RabbitMQ、RocketMQ

追求吞吐能力:RocketMQ、Kafka

追求消息低延迟:RabbitMQ、Kafka

RabbitMQ

四个概念:

在这里插入图片描述

  • Publisher:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给交换机
  • Exchange:交换机。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有以下3种类型:
    • Fanout:广播,将消息交给所有绑定到交换机的队列
    • Direct:定向,把消息交给符合指定routing key 的队列
    • Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
  • Consumer:消费者,与以前一样,订阅队列,没有变化
  • Queue:消息队列也与以前一样,接收消息、缓存消息。

Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!

工作原理

在这里插入图片描述

  • Broker:
    接收和分发消息的应用,RabbitMQ Server 就是 Message Broker
  • Virtual host
    出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似 于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出 多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等,实现不同服务之间的隔离。
  • Connection
    publisher/consumer 和 broker 之间的 TCP 连接。
  • Channel
    如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程 序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客 户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销。
http://www.lryc.cn/news/337637.html

相关文章:

  • 算法-快速幂
  • Flutter中工厂方法的多种实现方法与使用场景分析
  • kafka(六)——存储策略
  • Linux 内核:线程的实现
  • SonarQube 9.9.4 LTS社区版安装
  • Laravel 11入门:使用ServBay打造高效开发环境
  • Flink WordCount实践
  • 时间序列分析 # 平稳性检验和ARMA模型的识别与定阶 #R语言
  • 算法-日期问题
  • 《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.5 年末操作:维护新财政年度会计凭证编号范围
  • 2024年第十七届“认证杯”数学中国数学建模网络挑战赛A题思路
  • Linux 添加启动服务--Service
  • 构建智能连接的未来:物联网平台系统架构解析
  • element-ui的年份范围选择器,选择的年份需等于或小于当前年份,选择的年份范围必须在三年之内
  • 2024年蓝桥杯40天打卡总结
  • STL函数对象
  • DedeCMS 未授权远程命令执行漏洞分析
  • 学习 Rust 的第二天:Cargo包管理器的使用
  • 【爬虫+数据清洗+可视化分析】Python文本分析《狂飙》电视剧的哔哩哔哩评论
  • 使用vite从头搭建一个vue3项目(二)创建目录文件夹以及添加vue-router
  • 循环控制语句的实际应用(3)
  • 突破像素限制,尽显照片细腻之美——Topaz Gigapixel AI for Mac/Win
  • CSS特效---HTML+CSS实现3D旋转卡片
  • Rust跨平台编译
  • php其他反序列化知识学习
  • 浏览器工作原理与实践--HTTP/1:HTTP性能优化
  • idea 使用springboot helper 创建springboot项目
  • 关于 Amazon DynamoDB 的学习和使用
  • 【fastapi】搭建第一个fastapi后端项目
  • Qt/QML编程之路:图片进度条的实现(50)