初识消息队列

news2024/11/17 11:48:25

消息队列

字面意思就是存放消息的队列(Message Queue 简称MQ),最简单的消息队列模型包括了三个角色:

  1. 消息队列:存储和管理信息,也被称为消息代理
  2. 生产者:发送消息到消息队列
  3. 消费者:从消息队列中获取消息并处理消息

image-20230522155404261

Redis提供了三种不同的方式来实现消息队列:

  • list结构:基于List结构模拟消息队列(LPUSH结合BRPOP,或者RPUSH结合BLPOP来实现)

    image-20230522212633063

    • 优点:
      1. 利用Redis存储,不受限于JVM内存上限
      2. 基于Redis的持久化机制,数据安全性有保证
      3. 可以满足消息有序性
    • 缺点:
      1. 无法避免消息丢失
      2. 只支持单消费者
  • PubSub(Publish Subscribe Redis 2.0引入的消息传递模型,消费者可以订阅一个或多个channel,生产者向对应channel发送消息后,所有订阅者都能收到相关消息):基于的点对点消息模型。

    IMG_20230522_212529

    • 优点:采用发布订阅模型,支持多生产、多消费
    • 缺点:
      1. 不支持数据持久化
      2. 无法避免消息丢失
      3. 消息堆积有上限,超出时数据会丢失
  • Stream(Redis 5.0引入的一种新数据类型,可以实现一个功能非常完善的消息队列):比较完善的消息队列模型。image-20230522213552495

    • 优点:
      1. 消息可以回溯。
      2. 一个消息可以被多个消费者读取。
      3. 可以阻塞读取(使用while(true)死循环实现)
    • 缺点:有消息漏读的风险(当消费者再处理一个请求的同时队列中存入了几条新消息,根据每次获取最新消息的原则,则存入的几条新消息中除了最后一条消息会被读取,中间的消息就会被漏读)

综上,可以得出,使用Redis中的Stream来模拟消息队列是最合适的。但其也存在缺点,如何来规避这个漏读的风险呢?

消费者组

定义:将多个消费者划分到一个组中,监听同一个消息队列。

消费者组具有以下特点:

  1. 消息对流:队列中的消息会分流给组内的不同消费者(消费者相互之间存在竞争关系),而非重复消费,从而加快消息处理的速度。
  2. 消息标示:消费者组会维护一个标示,记录最后一个被处理的消息(即使消费者宕机重启,也会从标示之后读取消息),可以确保每一个消息都会被消费(解决了漏读风险)。
  3. 消息确认:消费者获取消息后,消息会处于pending(待处理)状态,并存入一个pending-list中。当消息处理完成后需要通过XACK来确认消息,标记消息已被处理,才会从pending-list中移除。

创建消费者组

创建命令为:

XGROUP CREATE key groupName ID [MKSTREAM]
  • key:队列名称
  • groupName:消费者组名称
  • ID:其实ID标示,$代表队列中最后一个消息,0则代表队列中第一个消息
  • MKSTREAM:队列不存在时自动创建队列

其他命令:

# 删除指定的消费者组
XGROUP DESTORY key groupName

# 给指定的消费者组添加消费者
XGROUP CREATECONSUMER key groupName consumername

# 删除消费者组中的指定消费者
XGROUP DELCONSUMER key groupName consumername

从消费者中读取消息:

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]
  • group:消费者组名称
  • consumer:消费者名称,如果消费者不存在,则会自动创建一个消费者
  • count:本次查询的最大数量
  • BLOCK milliseconds:当没有消息时最长的等待时间
  • NOACK:无需手动ACK,获取到消息后自动确认
  • STREAMS key:指定队列名称
  • ID:获取消息的起始ID:
    • “>”:从下一个消费者开始。
    • “其它”:根据指定id从pending-list中获取已经消费但未确认的消息,例如0,是从pending-list中的第一个消息开始。

所以消息队列的优点有:

  1. 消息可回溯。
  2. 可以多个消费者争抢消息,加快消费速度。
  3. 可以阻塞读取。
  4. 没有消息漏读的风险。
  5. 有消息确认机制,保证消息至少被消费一次。

此时,可以针对Redis模拟消息队列的三种形势进行表格分析

ListPubSubStream
消息持久化支持不支持支持
阻塞读取支持支持支持
消息堆积处理受限于内存空间,可以利用多消费者加快处理受限于消费者缓冲区受限于队列长度,可以利用消费者组提高消费速度,减少堆积
消息确认机制不支持不支持支持
消息回溯不支持不支持支持

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

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

相关文章

基于TensorFlow和Keras的狗猫数据集的分类实验

文章目录 前言一、环境配置1、anaconda安装2、修改jupyter notebook工作目录3、配置TensorFlow、Keras 二、数据集分类1、分类源码2、训练流程 三、模型调整1.图像增强2、网络模型添加dropout层 四、使用VGG19优化提高猫狗图像分类1、构建网络模型2、初始化一个VGG19网络实例3、…

C语言--消失的数字

文章目录 1.法一&#xff1a;映射法2.法二&#xff1a;异或法3.法三&#xff1a;差值法4.法四&#xff1a;排序查找 1.法一&#xff1a;映射法 时间复杂度&#xff1a;O&#xff08;N&#xff09; 空间复杂度&#xff1a;O&#xff08;N&#xff09; #include<stdio.h>…

第4章 信息系统管理

文章目录 4.1.1 管理基础1 层次结构2 系统管理 4.1.2 规划和组织1 规划模型2 组织模型1&#xff09;业务战略&#xff08;竞争力优势模型&#xff1a;差异化、总成本领先、专注 战略&#xff09;2&#xff09;组织机制战略&#xff08;莱维特钻石模型&#xff1a;信息与控制、人…

【C++学习】类和对象 | 再谈构造函数 | 构造函数中的隐式类型转换 | static静态成员

目录 1. 再谈构造函数 2. 构造函数中的隐式类型转换 3. static静态成员 写在最后&#xff1a; 1. 再谈构造函数 我们之前使用构造函数初始化&#xff1a; #include <iostream> using namespace std;class Date { public:Date(int year 2023, int month 7, int da…

arcgis js 通过某一个经纬度 定位报错,并且图标变得很大【已解决】

报错 svg.js:42 Error: attribute transform: Expected number, “…0000,0.02102085,NaN,NaN)”. svg.js:49 Error: attribute x: Expected length, “NaN”. svg.js:49 Error: attribute y: Expected length, “NaN”. 图标特别大&#xff0c;也看不到地图 分析 这个方法中…

智驾“平价”,小鹏G6打特斯拉是认真的

作者|张祥威编辑|德新 “小鹏在辅助驾驶领域不是遥遥领先&#xff0c;而是领先友商 12 - 36 个月。” “希望L4的能力能够在2027年到来&#xff0c;或者更早一点。” “G6的销量肯定要过万&#xff0c;这是最起码的。” G6上市发布期间&#xff0c;小鹏的高管各种喊话。 抛开80…

(嵌入式)STM32G061C8T6、STM32G061C6T6、STM32G061C8U6 64MHz 64KB/32KB 闪存(MCU)

STM32G0 32位微控制器 (MCU) 适合用于消费、工业和家电领域的应用&#xff0c;并可随时用于物联网 (IoT) 解决方案。这些微控制器具有很高的集成度&#xff0c;基于高性能ARM Cortex-M0 32位RISC内核&#xff0c;工作频率高达64MHz。该器件包含内存保护单元 (MPU)、高速嵌入式内…

算法笔记--滑动窗口

力扣209.长度最小子数组 https://leetcode.cn/problems/minimum-size-subarray-sum/ 在这道题中要注意的不仅仅是滑动窗口的问题&#xff0c;更重要的问题是在循环控制中&#xff0c;不恰当的语法使用会导致这道题出现很严重的问题&#xff0c;这导致我做这道题做了很多天&…

亿级数据毫秒级响应?

作为一名深陷在增删改查泥潭中练习时长三年的夹娃练习生&#xff0c;偶尔会因为没有开发任务不知道周报写什么而苦恼。 正愁这周写啥呢&#xff0c;组长过来交代了个跟进第三方公司性能测试报告的工作&#xff0c;我一寻思这活不最好干了吗&#xff0c;正愁不知道周报咋写呢&a…

github上传文件及其问题解决

文章目录 1. github上上传文件夹2. <filename> does not have a commit checked out3. this exceeds GitHubs file size limit of 100.00 MB4. error: src refspec master does not match any 1. github上上传文件夹 首先在github上create a new repository&#xff0c;…

C语言王国探险记之字符串+注释

王国探险记系列 文章目录&#xff08;3&#xff09; 前言 一&#xff0c;什么是字符串呢&#xff1f; 1&#xff0c;那C语言是怎么表示字符串的呢? "hello world.\n" 2&#xff0c;证明字符串的结束标志是一个 \0 的转义字符 3&#xff0c;证明字符串的结束标…

云原生之深入解析Flink on k8s的运行模式与实战操作

一、概述 Flink 核心是一个流式的数据流执行引擎&#xff0c;并且能够基于同一个 Flink 运行时&#xff0c;提供支持流处理和批处理两种类型应用。其针对数据流的分布式计算提供了数据分布&#xff0c;数据通信及容错机制等功能。Flink 官网不同版本的文档flink on k8s 官方文…

linux-2.6.22.6内核网卡驱动框架分析

网络协议分为很多层&#xff0c;而驱动这层对应于实际的物理网卡部分&#xff0c;这也是最底层的部分&#xff0c;以cs89x0.c这个驱动程序为例来分析下网卡驱动程序框架。 正常开发一个驱动程序时&#xff0c;一般都遵循以下几个步骤&#xff1a; 1.分配某个结构体 2.设置该结…

IDEA将java项目打包为jar包

方法 首先在src -> resources目录下建立一个文件夹&#xff0c;然后再在新建文件夹里面建立META-INF文件夹&#xff08;不推荐直接建立META-INF&#xff0c;否则后面打包完的jar包需要手动修改配置&#xff09; 然后点击File -> Project Structure -> Artifacts -&g…

第三章:Faster R-CNN网络详解(《Faster R-CNN: 基于区域提议网络的实时目标检测》)

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:YOLO v1网络详解 第五章:YOLO v2网络详解 第六章:YOLO v3网络详解 文章目录 系列文章目录技术干货集锦前言一、摘要二、正文分析 1.引入库2.读…

Mysql的逻辑架构_读写锁_事物

概览 一. MySql的逻辑架构1. 逻辑架构图2. 连接管理与安全性 二. 并发控制1. 读写锁2. 锁粒度 三. 事务1. 特性2. 隔离级别3. 死锁4. 事物日志&#xff1f;5.MySql中的事物 mysql最与众不同的特性&#xff1a;存储引擎架构 架构的设计&#xff1a; 将查询处理(Query Processin…

7、注解与自定义注解

1 注解 注解很厉害&#xff0c;它可以增强我们的java代码&#xff0c;同时利用反射技术可以扩充实现很多功能。它们被广泛应用于三大框架底层。 传统我们通过xml文本文件声明方式(如下图,但是XML比较繁琐且不易检查)&#xff0c;而现在最主流的开发都是基于注解方式&#xff0c…

房贷计算器——新增选择还款方式

房贷计算器——新增选择还款方式 #!/usr/bin/env python # coding: utf-8# In[4]: 文字‘房贷计算器’ 文字‘贷款总金额’&#xff1a;输入框 文字‘贷款期限’&#xff1a;输入框 文字‘年利率’&#xff1a;输入框 按钮‘开始计算’ 返回&#xff1a; 月供 总利息 from tki…

【Framework】bindService启动流程

前言 在【Service启动流程之startService】 中&#xff0c;我们已经分析了startService的流程&#xff0c;这篇就继续讲bindService的流程&#xff0c;他们两有很多相似之处。同样&#xff0c;流程图在总结处。 我们在调用bindService方法时候&#xff0c;实际调用的是Contex…

台庆|三联开关怎么接线?

三联开关是一种常见的开关类型&#xff0c;通常用于控制一个电路中的三个不同的电器或灯具。它的用途非常广泛&#xff0c;因此了解如何正确接线是非常重要的。在本文中&#xff0c;我们将详细讨论三联开关的接线方法。 我们先来看看三联开关实物图与线路图&#xff1a; 接下来…