消息队列一文全解!!!

news2024/11/15 17:32:14

消息队列的用途是什么?

第一章 消息队列的用途是什么?
第二章 消息重复消费如何避免?
第三章 消息的顺序性可靠性如何保证?
第四章 高可用的消息队列如何搭建?
第五章 消息队列面试题汇总


文章目录

  • 消息队列的用途是什么?
  • 前言
  • 一、消息队列是什么?
  • 二、为什么使用消息队列?
      • 1. 异步通信
      • 2. 削峰填谷
      • 3. 解耦
  • 三、市面上常用消息队列对比
  • 总结


前言

本系列文章将对市面上几种主流的消息队列展开详细介绍和深度剖析,我想不管是日常工作还是面试,消息队列一直都是绕不开的话题,在高并发高可用系统架构模型的时代,消息队列似乎成了各家公司在做技术选型时的首选,那么我想市面上的几种消息队列你一开始接触的时候一定很头疼吧。不管你是刚使用消息队列的新手还是已经使用了很多年的老手,你一定能从本系列文章获得新的收获和经验总结。
在这里插入图片描述


一、消息队列是什么?

消息队列是一种在软件系统中广泛应用的通信模式,用于在不同的组件、服务或系统之间传递数据。它基于先进先出(FIFO)的原则,允许生产者将消息发送到队列中,并由消费者从队列中获取消息进行处理,而这两个过程是异步进行的。

具体来说,消息队列通常由三个主要组件组成:

  1. 生产者(Producer):生产者是消息的创建者和发送者,它们负责生成消息并将其发送到消息队列中。生产者可能是应用程序、服务、或者是系统中的其他组件。一旦生产者将消息发送到队列中,它们就可以继续执行其他任务,而无需等待消息被处理。

  2. 消息队列(Message Queue):消息队列是消息传递的中间媒介,它由消息代理(Message Broker)管理。消息队列负责接收、存储和转发消息,并确保消息按照其发送顺序进行处理。消息队列的关键特性之一是持久性,即使在生产者或消费者出现故障时,消息也不会丢失。

  3. 消费者(Consumer):消费者订阅队列中的消息,并负责处理它们。消费者可能是应用程序、服务或系统中的其他组件。一旦消息可用,消费者就可以从队列中获取消息并执行相应的操作。与生产者一样,消费者也是异步执行的,因此它们可以在没有直接通信的情况下处理消息。

消息队列的工作原理是通过解耦生产者和消费者之间的通信,实现了系统中不同组件之间的松耦合。这种松耦合使得系统更易于扩展、维护和升级,并提高了系统的可靠性和灵活性。

除了上述的基本组件外,消息队列还可能具有其他功能,例如消息的路由、消息的持久性、消息的优先级等。这些功能使得消息队列能够满足各种不同的业务需求,并在各种应用场景中得到广泛应用,如微服务架构、事件驱动架构、任务队列、日志处理等。

二、为什么使用消息队列?

从上述介绍我们能够理解为啥这么多公司喜欢用消息队列了,因为它真的足够强大,三个比较核心的点,也是我们经常聊到的就是异步削峰解耦。
在这里插入图片描述
当谈到消息队列时,常常从异步通信、削峰填谷和解耦三个角度来说明其重要性和应用价值。让我们逐个角度来举例说明:

1. 异步通信

消息队列允许生产者和消费者之间进行异步通信,这意味着生产者在将消息发送到队列后,不需要等待消费者立即处理消息,而是可以继续执行其他任务。这种异步通信有助于提高系统的响应速度、吞吐量和性能。

举例:假设一个电子商务网站的订单处理系统。当用户下单时,系统不需要立即处理订单支付、库存管理和发货等操作,而是可以将订单信息发送到消息队列中。然后,各个后台服务可以异步地从队列中获取订单消息并进行相应的处理。这种异步通信可以帮助网站应对高并发订单,同时保持系统的稳定性和可靠性。
在这里插入图片描述
如果采用串行的调用方式那么会对用户的体验影响很大,用户会觉得你这个系统真的慢死了,但是如果改成通过消息队列的方式,那么会大大提升用户的体验,减少很多投诉。

2. 削峰填谷

消息队列还可以帮助平衡系统的负载,即在高负载时削峰,低负载时填谷。当系统面临突发性的高流量时,消息队列可以暂时存储请求,以防止系统过载崩溃。而在低流量时,消费者可以按照自己的处理能力逐步处理消息,从而保持系统的稳定性和可靠性。

举例:考虑一个社交媒体平台的消息推送系统。在特定的事件(如热门话题、重要公告等)引发大量用户互动时,系统可能会收到大量的消息推送请求。通过使用消息队列,系统可以将这些消息暂时存储起来,并根据推送服务的处理能力逐步发送消息,从而避免因突发流量而导致的系统崩溃。
因为正常情况下系统的承受能力是有限的,这种大流量的突然出现,确实很可能导致系统崩溃,而用mq去做一次中转,会极大的减轻系统压力,可参考下图。
在这里插入图片描述

3. 解耦

消息队列可以帮助解耦系统中的各个组件,降低组件之间的依赖性,使系统更易于扩展、维护和升级。通过将组件之间的通信交由消息队列来处理,组件之间不再直接相互调用,而是通过消息进行间接通信,从而实现了松耦合。

举例:想象一个在线支付系统,其中包括订单处理、支付处理和库存管理等组件。通过使用消息队列,这些组件之间可以通过消息进行通信,而不需要直接相互调用。例如,当用户下单时,订单处理组件将订单信息发送到消息队列中,支付处理组件可以异步地从队列中获取订单信息并处理支付,而库存管理组件也可以根据订单信息更新库存。这种解耦方式使得各个组件可以独立开发、测试和部署,同时降低了系统的复杂性和耦合度。

在这里插入图片描述

三、市面上常用消息队列对比

ActiveMQ、RabbitMQ、RocketMQ、Kafka 有什么优缺点?

特性ActiveMQRabbitMQRocketMQKafka
单机吞吐量万级,比 RocketMQ、Kafka 低一个数量级同 ActiveMQ10 万级,支撑高吞吐10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景
可用性高,基于主从架构实现高可用同 ActiveMQ非常高,分布式架构非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可
时效性ms 级微秒级,这是 RabbitMQ 的一大特点,延迟最低ms 级延迟在 ms 级以内
消息可靠性有较低的概率丢失数据基本不丢经过参数优化配置,可以做到 0 丢失同 RocketMQ
社区支持MQ 领域的功能极其完备基于 erlang 开发,并发能力很强,性能极好,延时很低MQ 功能较为完善,还是分布式的,扩展性好功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用

总结

这些消息队列我基本都有使用过,就目前来看ActiveMq已不建议大家继续使用了,一是比较古老,虽然功能比较完备,但现成的社区没有其他几个完备,遇到问题解决起来会比较棘手。另外RabbitMq和RocketMq,如果没有极高的并发要去我觉得RabbitMq可能更容易上手,社区也比较完善,像kaffa 这个就更不用说了,配合大数据系统来处理一下采集任务会非常给力,谁用谁知道。

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

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

相关文章

Vue页面生成导出PDF文件

第一种&#xff1a; 使用浏览器自带打印方法window.print(); 也可使用print-js插件&#xff08;原理相同&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>printDemo</title> </…

安防监控/智能分析EasyCVR视频汇聚平台海康/大华/宇视摄像头国标语音GB28181语音对讲配置流程

一、背景分析 近年来&#xff0c;国内视频监控应用发展迅猛&#xff0c;系统接入规模不断扩大&#xff0c;涌现了大量平台提供商&#xff0c;平台提供商的接入协议各不相同&#xff0c;终端制造商需要给每款终端维护提供各种不同平台的软件版本&#xff0c;造成了极大的资源浪…

测试工程师面试准备(软硬件)

您好&#xff0c;我叫XXX。学历XX&#xff0c;XXX专业毕业。X年X月份毕业&#xff0c;但是去年二月份已经找到工作开始实习了&#xff0c;目前工作一年了&#xff0c;这一年的过程中我主要负责软件的开发和测试和软硬件联调测试工作。具体来说就是&#xff0c;在软件开发完成后…

制造业小企业内部小程序简单设计

也没什么需求&#xff0c;就是看企业内部外来单位就餐还需要打印客饭单拿去食堂给打饭师傅&#xff0c;出门单还需要打印纸质版&#xff0c;车间PDA扫码出问题需要人手动处理&#xff0c;会议室需要OA申请&#xff0c;但是申请前不知道哪些会议室事空的(因为不是每个人都下载OA…

neovim0.9版本安装

一 安装 Installing Neovim neovim/neovim Wiki (github.com)https://github.com/neovim/neovim/wiki/Installing-Neovim/921fe8c40c34dd1f3fb35d5b48c484db1b8ae94b 1 下载 curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage chmod ux n…

【黑马点评Redis——003优惠券秒杀4——消息队列Stream】

1. 目前还存在的问题 设置的阻塞队列可能会超出最大长度系统重启会导致阻塞队列中的信息消失&#xff0c;可能会出现问题 2. 消息队列 消息队列 (Message Queue)。 字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色消息队列:存储和管理消息&#xff0c;也被称为…

网页自动跳转到其他页面,点击浏览器返回箭头,回不到原来页面的问题

背景&#xff1a;今天产品提个需求&#xff0c;需要从index页面自动触发跳转到下一页面的事件&#xff0c;从而不做任何操作&#xff0c;直接跳转到test页面。 代码是这样的&#xff1a; index.vue: <template><div style"width:500px;height:600px;background-…

20 Debian如何配置DNS服务(2)主从服务器

作者&#xff1a;网络傅老师 特别提示&#xff1a;未经作者允许&#xff0c;不得转载任何内容。违者必究&#xff01; Debian如何配置DNS服务&#xff08;2&#xff09;主从服务器 《傅老师Debian小知识库系列之20》——原创 前言 傅老师Debian小知识库特点&#xff1a; 1、…

纸箱码垛机:从传统到智能,科技如何助力产业升级

随着科技的飞速发展&#xff0c;传统工业领域正经历着一场重要的变革。作为物流行业重要一环的纸箱码垛机&#xff0c;其从传统到智能的转型升级&#xff0c;不仅提高了生产效率&#xff0c;还大幅降低了人工成本&#xff0c;为产业升级提供了强大助力。星派将探讨纸箱码垛机的…

【一些神金】怎么缓解工作压力?使用VS-code彩虹屁插件

怎么缓解工作压力&#xff1f; 其实吃点好的&#xff0c;多睡一会儿&#xff0c;再锻炼锻炼身体就好。 但我只是想炫耀一下这个彩虹屁插件。 原版插件&#xff1a;VS-code-Rainbowfart 我的版本&#xff1a;RainbowFart-Oberon 基于 MIT 开源&#xff0c;包括所有设计资源及音…

大数据信用风险竟然是这样形成的!查询方法也很简单

在大数据时代背景下&#xff0c;大数据信用风险成为了众多机构关注的焦点。这类风险涵盖了多头借贷、履约行为、联系人以及司法等多个方面。本文将深入解析大数据信用风险的形成原因及其查询方法&#xff0c;让我们一起来探索一下。 大数据信用风险主要表现在以下几个方面&…

硬盘删除的文件怎么恢复?这4个方法可以恢复误删文件

在数字时代&#xff0c;硬盘作为我们存储信息的主要工具&#xff0c;承载着大量的重要数据。然而&#xff0c;有时我们可能会因为误操作或病毒攻击等原因&#xff0c;不小心删除了硬盘中的文件。这时&#xff0c;如何有效地恢复这些文件就显得尤为重要。今天给大家分享三种恢复…

币圈是什么意思?币圈开发

币圈是一个涵盖了区块链、加密货币及其应用的独特领域&#xff0c;它的兴起与发展已经彻底改变了我们对金融、科技和未来的认知。 一、什么是币圈&#xff1f; 币圈可以被理解为围绕虚拟货币展开的一系列活动和产业的总称。它包括区块链技术的研发、数字货币的创造、交易、投资…

图形界面挂了?教你如何纯命令行下快速安装CentOS 7

在某些特定的系统或软件环境下&#xff0c;如使用 Parallels Desktop 18&#xff08;PD18&#xff09;虚拟化软件安装较老版本的操作系统&#xff08;如 CentOS 7&#xff09;&#xff0c;可能会遇到只能通过命令行进行安装的情况。这通常是由于内核版本与图形安装器的兼容性问…

JavaScript 进阶 (三)之构造函数/原型对象/对象原型/原型继承/原型链

JavaScript 进阶 &#xff08;三&#xff09;之构造函数/原型对象/对象原型/原型继承/原型链 编程思想面向过程面向对象 构造函数原型对象constructor 属性对象原型原型继承原型链 了解构造函数原型对象的语法特征&#xff0c;掌握 JavaScript 中面向对象编程的实现方式&#x…

【书生浦语第二期实战营学习笔记作业(四)】

课程文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/readme.md 作业文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md 书生浦语第二期实战营学习笔记&作业(四) 1.1、微调理论讲解及 XTuner 介绍 两种Fin…

C语言实现简单CRC校验

目录 一、实现题目 二、send模块 三、receive模块 四、运行截图 一、实现题目 二、send模块 #include <stdio.h> #include <string.h>// 执行模2除法&#xff0c;并计算出余数&#xff08;CRC校验码&#xff09; //dividend被除, divisor除数 void divide…

maya blendshape

目录 shape编辑器 maya创建blendshape python 脚本 添加形变动画 查看顶点个数 shape编辑器 打开方式&#xff1a; 窗口-动画编辑器-形变编辑器 maya创建blendshape python 脚本 import maya.cmds as cmds# 创建基础网格 - 球体 baseMesh cmds.polySphere(name"bas…

计算机技术的发展与未来趋势

引言 随着科技的飞速发展&#xff0c;计算机技术已成为现代社会不可或缺的一部分。从最初的简单计算工具到如今的超级计算机、云计算、人工智能等技术的广泛应用&#xff0c;计算机技术的变革深刻影响着我们的生活和工作方式。本文将探讨计算机技术的发展历程、当前的应用领域…

【Qt】.ui文件转.h文件

1、打开qt命令行 2、转换 uic -o ui.h mainwindow.ui