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

【MQ01】什么是消息队列?用哪个消息队列?

什么是消息队列?用哪个消息队列?

来了来了,消息队列系列总算来咯。对于搜索引擎相关的知识大家消化的怎么样呀?其实对于搜索引擎来说,我们学习的内容还是挺全面的,也算是比较深入了。而对于消息队列来说,我不准备写得太深入,因为对于这个东西,实战并不算多,主要的原因咱们在今天这篇文章结束的时候再详细的来说吧。

先来说概念,到底啥是消息队列?那么多种消息队列工具,或者叫消息队列中间件,我们应该选择哪个呢?我将以哪个作为主讲呢?咱们一一来看。

消息队列

说消息队列之前,不得不先说一下队列。跟过我之前数据结构系列的同学们,对队列应该不陌生吧。排队上公交的例子还记得吧?队列的特点最简单的理解就是通过数组,数据从数组的一端进入,比如从数组尾部添加数据(或尾指针),然后从另一端(头部或头指针)出。与之对应的还有一种叫做栈的东西,正好是和它反过来的,栈是从相同的一头进出数据。将队列想像成一根绳子,将它平铺后就有左右两端,我们可以在左边续上新的绳子这叫入队,然后从右边剪掉一部分,这叫出队。同样的,也可以右进左出,反正只要不是在一边出的,就可以看做是队列。

链表和数组都可以实现队列,而且 PHP 中的数组函数也可以非常方便地实现队列这种数据结构。队列在树和图的遍历中,还可以实现广度遍历的效果。这些内容如果大家不记得了,还是要再复习一下哦。

消息队列,英文名是 Message Queue ,简称 MQ 。很明显,它是将“消息”放到队列中。是的,不管别的什么高大上的定义,只要你了解队列的含义,然后把消息当成是要加入队列的数据,或者说,把队列里面的数据称为消息,这就是消息队列。

最早的消息队列,其实是应用在操作系统中作为进程间通信的一种方式存在的。这一块的内容我们之前在 Swoole 系列进程间通讯相关的内容中也讲过。而通常大家所说的消息队列,则是一种中间件,是一种独立的存储型队列系统,不仅可以跨进程跨应用通信,还可以跨服务器远程通信。简单点理解,我们可以写多个系统,然后连接同一个数据库,不同的系统通过读取数据库里的数据就可以实现这些系统之间的通信。而消息队列中间件系统,也是这样的可以独立以及分布式部署的像数据库一样的东西。它以队列这种数据结构为基本载体,让数据以有序的、有流向的方式保存起来。所有的应用、服务、程序都可以读写这个中间队列库中的数据,而这些数据就被称为消息。

通常,消息队列最典型的应用就是由一个应用程序作为生产者,而另一个应用程序作为消费者。当然,也可以同一个程序即是生产者也是消费者。生产者向队列中添加数据,消费者从队列中读取数据,这个添加和读取的顺序都是遵循队列的基本特征的左进右出或右进左出就可以了。一般是先进队的数据先被取出来,对应的一个计算机名词就是 FIFO (First In First Out,栈是 LIFO,Last in First out)。当然,也有优先队列可以改变这种顺序,这个也是非常常见的一个概念。

消息队列本质上就是一个大的缓冲区,只受磁盘和内存容量的限制,可以让不同的生产者向队列中发送消息,也可以让不同的消费者从队列中获取数据。因为这个特点,它可以帮我们做很多平常写程序很难做到的事情,我们最后一个小节会专门讲到消息队列的用途。

好了,其实消息队列的概念大家或多或少都应该了解,咱们也不多废话了。接下来就看看现在市面上各种消息队列工具吧。

各种消息队列工具

之前我们在讲搜索引擎时提到过不少搜索引擎工具。比如说 ES、Sphinx、Solr,还有我们主讲的 XS 以及纯 PHP 实现的 TNTSearch 。是不是感觉都快有选择恐惧症了。说实话,在搜索引擎领域真的不用选择恐惧,大项目直接 ES ,中小型项目 XS ,小型项目 TNTSearch ,没毛病。而对于消息队列,那才真的是让你选择焦虑。

首先,现在最火的大名鼎鼎的 Kafka ,你要是没听过它的大名,就相当于在搜索引擎领域不知道 ES ,在数据库领域不知道 MySQL 一样。但是,相对来说,它的领先地位远达不到 ES 的一骑绝尘和 MySQL 的大比重。不过,它的增长势头也一直没有停歇。同时,它还是配合大数据的最常用的消息队列,天生分布式,并且需要使用 Zookeeper 来做分布式部署。速度极快,单机最高每秒百万级数据吞吐,时效性毫秒级。

然后,就是 RabbitMQ ,另一个大佬,使用 Erlang 开发的消息队列系统。在 Kafka 没有大火前,兔子队列应该是消息队列系统的大哥大。完整的确认及持久化机制,让他的安全性非常高。各种开发语言组件异常丰富,自带的管理界面也非常好用。单机吞吐量万级,时效性微妙级。

两个大哥大,但是它们并没有垄断,还有 RocketMQ 和 ActiveMQ ,一个是阿里开源的类似 Kafka 的,不过仅支持 Java 。另一个是老牌消息队列系统,但也是 Apache 下的顶级项目。

别忘了,Redis 也是有消息队列功能的,所以在这一领域,Redis 是绝对有资格来分一杯羹的。

上面五个是非常常见的消息队列系统,也是非常出名的,但是还有一些比较小众的消息队列系统。说小众其实更确切的说是我在干 PHP 这些年中,接触过的一些 PHP 项目中使用过的消息队列系统。

第一个也是比较古老的,但非常简单的 SQS ,全名是 简单队列系统 ,有用过的小伙伴举手!现在应该叫 Amazon SQS 了吧,是 Amazon 提供的一个云服务?还是这个开源组件就是 Amazon 来维护了?我也不清楚,当时我们的是自己搭起的服务。这个东西真的就是一个完全的队列数据结构的网络存储实现,貌似没有别的什么特别的功能。太久之前用过了,我都记不清细节了。

另外一个叫 Beanstalkd ,用过 Laravel 框架的同学一定见过这个单词吧。Laravel 的队列组件中,直接可用的三个驱动,一个是 Redis ,一个是 Amazon SQS,另一个就是 Beanstalkd 。这个消息队列我没有实战用过,但我知道它是一个非常轻量级的,功能很完整的消息队列系统。如果说 Redis 中的队列功能只是一个附属功能,不是一个完整的消息队列系统级实现的话,那么 Beanstalkd 则是一个非常标准的消息队列实现。据说它就像是一个轻量级的 RabbitMQ 。反正我是没用过也没研究过啦,有用过的小伙伴可以评论区留言分享一些学习资料哦。

我们的选择

上面随便一说,就是一堆。

Kafka、RabbitMQ、RocketMQ、ActiveMQ、Redis、SQS、Beanstalkd 七个。说实话,还有更多的没列出来呢。前面五种是比较通用的,也比较常见的。后面两个则是在 PHP 项目中可能会见到的。

那么我们后面要讲解的,要学习的是哪个呢?

其实呀,在这个系统中,我只是想简单地介绍一下消息队列中的一些基本概念,并不打算像之前的系列文章那样深入的就某一种软件框架进行深入学习。为什么呢?

一是我最大接触过的项目,是一个游戏的统计分析系统,每天最高3000W+的日志量,1000W日活,最高并发单机2W+连接,三台应用服务器接收请求入队,4台消费者处理队列数据。生产者和消费者都是使用 Swoole ,要不应用服务器抗不住。三台服务器同时还提供广告、数据统计分析和后台的服务。这种情况下,也只是使用 Redis 的队列就搞定了,而且还是只用到最简单的 List 功能下的队列效果。配置就是一台 4G 容量的单机阿里云 Redis ,除了日志数据之外,也提供上述其它应用的缓存服务。也就是说,仅仅是这样配置的一个 Redis 就能抗住我所经历过的最大量的项目,所以我是实在不敢想象要用到 Kafka 这样的分布式消息队列的系统得有多大的数据量和并发数。

二是对于大部分的 PHPer 来说,可能连我上面的这种项目经历过的人都少,所以对于消息队列在高并发处理下的需求并不高。大部分的需求只是处理一些异步任务,比如说电商的下单之后的邮件、短信、消息通知之类的功能。对于这类功能来说,Redis 其实并不合适,前面也说过,它是有队列功能,但它并不完整。这样的功能,其实用 RabbitMQ 是非常合适的。

好了,结果也出来了吧?咱们后续学习的内容,以消息队列的概念和几种应用形式为主。使用的工具就是 RabbitMQ 和 Redis 。关于这两个系统具体的安装,以及详细的 API 咱们都不会详细地说,毕竟不是以软件工具的学习为主。

和之前的搜索引擎系列不同,当时我们是通过详细的学习 XS 的各种功能来引出搜索引擎的各种概念,然后通过概念的了解大家再看别的搜索引擎就会感觉非常轻松了。但在消息队列中,本身概念就不多,软件的功能也都是围绕着这些概念的。而且最主要的功能和概念,就是最简单的最普通的那种像数据结构和算法里的队列效果。因此,我们在这个系列中,就以消息队列的各种概念和简单的 RabbitMQ 及 Redis 的示例来进行学习。如果对这些工具的具体 API 有疑问,可以直接去相应的官网查找相关的资料,即使是 RabbitMQ 的官方文档,其实内容也真的不算多。

后续演示的内容,只需要单机的 RabbitMQ 和 Redis 就可以了。我这里是使用 Docker 安装的 RabbitMQ ,然后 Mac 系统的 brew 工具安装的 Redis ,大家也可以先提前准备好哦。需要安装 PHP 的 Redis 扩展以及 Composer 安装 php-amqplib/php-amqplib ,这是 RabbitMQ 的 PHP 扩展包。

学习的内容以我日常接触过的实际应用和消息队列的核心概念为主,因此,不会是某个单独软件工具的具体教程。就是再强调一遍上面说过的,我们是学习功能和概念的,不局限于某个具体的软件。这些功能和概念市面上所有的消息队列工具都有提供的。如果你要更加深入地学习某个队列应用的话,可以去查找相关的文档,比如说 RabbitMQ 的入门手册就有各个语言版本的 https://www.rabbitmq.com/getstarted.html 。这个手册中的这几个例子,浅显易懂,非常经典,是第一推荐学习资料。如果你完全没接触过 RabbitMQ 也没关系,因为每篇文章都会有 RabbitMQ 和 Redis 的实现。对于 Redis 来说,功能比较简单,查阅 Redis 的官方文档即可。而且之前咱们也已经一起学过 Redis 系列了,相信一直跟着我学习的同学都是没问题的。同时我们还会通过 Laravel 框架中的队列功能,来看看在 Redis 中,框架是如何实现本身 Redis 所不具备的各种队列功能的。这也是我们的重点学习内容,整个系列也就六篇文章,围绕的还是 PHPer 们在应用队列时的一些问题和相关概念。内容不多,但相信一起学习完之后,大家对消息队列会有一个更加全面的认识。

有不会安装的小伙伴可以评论区或者公众号留言,也可以加我微信哦!

消息队列能干什么?

最后咱们再说一下消息队列能干啥。这个其实也就是简单说下,毕竟相关资料太多了。而且在上面的例子中,我就已经说了两种应用场景了。

  • 流量削峰:高并发场景下的业务处理。就是我前面说的做统计系统的功能。客户端上报的日志,上传上来后直接入库,中间可能会有各种逻辑判断,请求并发量高了之后不仅是应用服务抗不住,数据库可能也抗不住。于是,先进队,然后再由消费者将数据分拆并进行初步整理后入库,以便于后续的分析使用。大数据系统大部分也是在干这事,Kafka 的分布式高并发能力,基本都是头部中大型互联网企业才能用得到的。还有一种情况,秒杀场景下,也会使用消息队列来应对瞬间的超大流量。

  • 应用解耦:就是我前面说过的,下单之后,要向商家发邮件、短信、通知消息,而且也有可能也要同步向客户发送。如果是同步操作,可能会等半天,而且万一邮件发送失败了要不要报错呢?用户界面直接显示报错还是算下单成功呢?使用消息队列之后,咱们下单就正常操作完订单表就好了,下订单的代码不用再写发送信息啥的,把订单信息放到消息队列,让对应的邮件服务、短信服务、通知服务从队列中拿到数据再各自去处理,不影响主业务的流畅完成。

  • 异步通信:综合上述两个功能,其实就是让我们的系统主流程可以快速完成,其它的流程让别的程序异步执行。所有系统也可以根据队列中的内容来进行通信,这也是消息队列在操作系统中最原始的功能。

说人话总结一下,消息队列应对的场景,最主要的问题就是解决大流量、大数据量下处理变慢或者直接崩溃的问题,让数据能够有个缓冲,或者分散处理。而对于我们 PHPer 来说,这一块其实很多同学的接触有限。而且就像上面我说过的,我接触过的最大流量,也只是通过一个很低配置的 Redis 中的不完全队列功能就解决了。所以说,对于消息队列,我的心得确实也只能是点到为止了。

总结

好了,总结一下吧,今天咱们就是简单聊了聊啥是消息队列,有哪些消息队列以及后续我们学习的主要方向。内容非常简单,同时这个系列也不是很复杂很冗长的,大家可以轻松对待哦。

相关文章:

【MQ01】什么是消息队列?用哪个消息队列?

什么是消息队列?用哪个消息队列? 来了来了,消息队列系列总算来咯。对于搜索引擎相关的知识大家消化的怎么样呀?其实对于搜索引擎来说,我们学习的内容还是挺全面的,也算是比较深入了。而对于消息队列来说&am…...

2023年度AI盘点 AIGC|AGI|ChatGPT|人工智能大模型

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 2023年是人工智能大语言模型大爆发的一年,一些概念和英文缩写也在这一年里集中出现,很容易混淆,甚至把人搞懵。 文章目录 前言01 《ChatGPT 驱动软件开…...

【Flink-CDC】Flink CDC 介绍和原理概述

【Flink-CDC】Flink CDC 介绍和原理概述 1)基于查询的 CDC 和基于日志的 CDC2)Flink CDC3)Flink CDC原理简述4)基于 Flink SQL CDC 的数据同步方案实践4.1.案例 1 : Flink SQL CDC JDBC Connector4.2.案例 2 : CDC Streaming ETL…...

长城资产信息技术岗24届校招面试面经

本文介绍2024届秋招中,中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等。 10月投递了中国长城资产管理股份有限公司的信息技术岗岗位,所在部门为长城新盛信托有限责任公司。目前完成了一面,在这里记录一下一面经…...

【计算机网络】TCP握手与挥手:三步奏和四步曲

这里写目录标题 前言三次握手四次挥手三次握手和四次挥手的作用TCP三次握手的作用建立连接防止已失效的连接请求建立连接防止重复连接 TCP四次挥手的作用:安全关闭连接避免数据丢失避免半开连接 总结: 总结 前言 TCP(传输控制协议&#xff09…...

设计模式学习总结

责任链模式 使用方法: 1.创建接口 2.定义实现类,每个实现类实现接口,并拥有一个ArchiveHandle的成员,用作责任链的链接 public interface ArchiveHandle {void handle(ArchiveVO archiveVO); } public class ArchivePreHandle i…...

「HDLBits题解」Cellular automata

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接:Rule90 - HDLBits module top_module(input clk,input load,input [511:0] data,output [511:0] q );always (posedge clk) begin…...

什么是API ?

API(应用程序编程接口) 就像现成的家具套件相对于家居建设,用一些已经切好的木板组装一个书柜,显然比自己设计,寻找合适的木材,裁切至合适的尺寸和形状,找到正确尺寸的螺钉,然后再组…...

Pytest中conftest.py的用法

Pytest中conftest.py的用法 ​ 在官方文档中,描述conftest.py是一个本地插件的文件,简单的说就是在这个文件中编写的方法,可以在其他地方直接进行调用。 注意事项 只能在根目录编写conftest.py 插件加载顺序在搜集用例之前 基础用法 这里…...

java.lang.IllegalArgumentException: When allowCredentials is true

1.遇到的错误 java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a…...

vue折叠展开transition动画使用keyframes实现

需求&#xff0c;我正常的菜单功能有隐藏与显示功能&#xff0c;需要增加动画 打开的时候宽度从0到300&#xff0c;关闭的时候&#xff0c;宽度从300到0 <template> <div id"app"> <button click"toggleLength">Toggle Length</bu…...

书生·浦语大模型实战营-学习笔记5

LMDeploy 大模型量化部署实践 大模型部署背景 LMDeploy简介 轻量化、推理引擎、服务 核心功能-量化 显存消耗变少了 大语言模型是典型的访存密集型任务&#xff0c;因为它是decoder-by-decoder 先把数据量化为INT4存起来&#xff0c;算的时候会反量化为FP16 AWQ算法&a…...

10. Profile

1. 区分环境的配置 1.1. properties 配置 假设&#xff0c;一个应用的工作环境有&#xff1a;dev、test、prod 那么&#xff0c;我们可以添加 4 个配置文件&#xff1a; applcation.properties - 公共配置application-dev.properties - 开发环境配置application-test.proper…...

YOLO 自己训练一个模型

一、准备数据集 我的版本是yolov8 8.11 这个目录结构很重要 ultralytics-main | datasets|coco|train|val 二、训练 编写yaml 文件 # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path…...

3.Eureka注册中心

3.Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 大家思考几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f;有多个user-service实例地址&#xff0…...

基于springboot+vue的墙绘产品展示交易平台系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…...

网络原理-初识(1)

目录 网络发展史 独立模式 网络互连 局域网LAN 广域网WAN 网络通信基础 IP地址 概念 格式 端口 概念 格式 认识协议 概念 作用 五元组 网络发展史 独立模式 独立模式:计算机之间相互独立; 网络互连 随着时代的发展,越来越需要计算机之间相互通信,共享软件和数…...

【GitHub项目推荐--人脸识别】【转载】

01 带有移动应用程序的人脸识别库 OpenFace 作为用于人脸识别的通用库&#xff0c;能够实现瞬态和移动人脸识别&#xff0c;目前在 GitHub 上斩获 14291 Star。以下为 LFW 数据集 Sylvestor Stallone 输入单个图像的流程。 项目地址&#xff1a;https://github.com/cmusatya…...

NLP自然语言处理介绍

自然语言处理&#xff08;NLP&#xff0c;Natural Language Processing&#xff09;是一门涉及计算机与人类语言之间交互的学科。它的目标是使计算机能够理解和生成人类语言&#xff0c;从而更好地处理和解析大量的文本数据。NLP不仅是人工智能领域中一个重要的分支&#xff0c…...

在线WebOffce在HTML/VUE/Electron纯前端网页编辑Office之打开Word后自动处于修订模式

在线办公协同办公过程中&#xff0c;对于老板给出的文档修改&#xff0c;如果在错别字方面都要自己一个个字去看的话也太浪费时间了&#xff0c;其实word上就有一个修订模式&#xff0c;可以帮助大家高效完成文档的修改&#xff0c;在线WebOffce在HTML/VUE/Electron纯前端网页编…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...