首页 > 其他分享 >消息队列基础

消息队列基础

时间:2023-07-16 10:23:04浏览次数:39  
标签:异步 事务 队列 基础 消息 序号 RocketMQ

消息队列本质是将同步处理转成异步处理

消息队列的基本要求
不丢消息
高可用
高性能

消息队列名称

RabbitMQ

RocketMQ

Kafka

优点

轻量级

低延迟和高稳定性

1. 与周边生态系统的兼容性最好

2. 基于异步批量设计的异步收发性能最好

缺点

1. 消息大量堆积时性能大幅下降

2. 使用的Erlang语言比较冷门

与周边生态系统的兼容性没有Kafka好

异步批量设计带来同步收发消息的响应时延高

适用场景

不对功能和性能有高要求,开箱即用

在线业务,例如交易系统

处理海量消息

 

主题和订阅
实现每个消费者都能收到全量消息

RocketMQ消费模型

每个主题包含多个队列,通过多个队列来实现多实例并行生产和消费。RocketMQ只在队列上保证消息的有序性,主题上无法保证消息顺序。同一个消费组内的消费者是竞争关系,不同消费组都会消费全量消息。消费者组数量和队列数没有关系。
Kafka也是如此。

利用事务消息来实现分布式事务
事务消息适用的场景是异步更新数据,对数据实时性要求不高。

如果在第4步提交事务消息到MQ时失败了怎么办?
Kafka的解决方案是直接抛出异常,在业务代码中反复重试提交,直到提交成功,或者删除之前创建的订单来补偿。

支撑这个RocketMQ事务反查机制,业务代码提供反查本地事务状态的接口,告知RocketMQ本地事务是否成功。

先开启本地事务,然后创建订单,订单创建成功后再发消息,根据发消息是否成功来决定
提交还是回滚本地事务。
如果本地事务提交失败,那么已经发出去的消息是无法撤回的,会导致数据不一致。

检测消息丢失的简单方法
利用消息队列的有序性来验证是否有消息丢失。
Producer端给每个发出的消息附加一个连续递增的序号,Consumer端检查这个序号的连续性。如果没有消息丢失,Consumer收到消息的序号必然是连续递增的,或者说收到的消息,其中的序号必然是上一条消息的序号 +1。如果检测到序号不连续,那就是丢消息了。还可以通过缺失的序号来确定丢失的是哪条消息,方便进一步排查原因。

 

参考资料

消息队列高手课

 

标签:异步,事务,队列,基础,消息,序号,RocketMQ
From: https://www.cnblogs.com/WJQ2017/p/17557522.html

相关文章

  • 0.mysql基础sql
    常用的数据库sql语句,数据库相关的技术和理论是成体系的,从基础使用到数据库原理,到性能优化,海量数据处理,但不同的技术角色所需掌握的深度是不同的:如果你是一位普通系统软件开发人员掌握基本sql操作、数据库索引、存储结构等也够用如果你是一位高并发系统的架构设计与开发者,那海量......
  • 五、函数的基础--2.函数的参数与返回值
    C语言函数的参数和返回值是函数定义时用来传递数据和返回结果的机制。函数参数:1.参数是函数定义中用于接收外部数据的变量。函数可以有零个或多个参数,每个参数包括类型和名称。2.参数允许将数据从函数的调用者传递到函数内部,函数在执行时可以使用这些参数来完成特定任务。3.参数......
  • 十、事务消息
    事务消息介绍及流程图RocketMQ在4.3.0版中已经支持分布式事务消息,是通过二阶段提交加事务回查来保证本地事务和发送消息的一致性。事务消息交互流程如下图所示。生产者将消息发送至ApacheRocketMQ服务端。ApacheRocketMQ服务端将消息持久化成功之后,向生产者返回Ack确认......
  • BFS和DFS基础
    BFS和DFS基础搜索简介搜索是"暴力法"算法的具体实现,是一种吧所有可能的情况都罗列出来,然后逐一检查,从中找到答案的方法。一般步骤找到所有可能的数据,并且永数据结构表示和存储。优化:尽量多的排除不符合条件的数据,以减少搜索空间。用某个算法快速检索这些数据。搜索算法的......
  • Python练手小项目——简易版基础SQL模板代码生成器
    1、效果图2、代码源码-ui.py:fromtkinterimport*fromtkinterimportscrolledtext,messageboxfromtkinter.ttkimportComboboximportpymysqldefinit():#创建窗口:实例化一个窗口对象window=Tk()#窗口大小window.geometry("900x550")......
  • 队列
    队列(Queue) 是 先进先出(FIFO,FirstIn,FirstOut) 的线性表对头出,队尾进   4.3.常见应用场景当我们需要按照一定顺序来处理数据的时候可以考虑使用队列这个数据结构。阻塞队列: 阻塞队列可以看成在队列基础上加了阻塞操作的队列。当队列为空的时候,出队操作阻塞,当......
  • jvm基础知识
    1.jvm基础知识说明:jvm除了是压测过程中重点关注的内容,也是面试的重点1.1基础回顾java特点:跨平台内存泄漏是过程,内存溢出是结果jdk,jre,jvm的关系jdk<jre<jvm数据类型及存储基本数据类型:存储在栈内存引用数据类型:值存在堆内存,栈里存堆内存中存放的值的首地址堆栈:堆:线程......
  • Java基础1
    Java基础1whitchbreak,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构switch结构中的表达式,只能是如下的6种数据类型之一:byte.short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)case之后只能声明常量。不能声明范围。break关......
  • C基础2
    字符数组charc1[]={'c','','p','r','o','g'};charc2[]="cprog";//末尾以'\0'为结束符用字符串方式赋值比用字符逐个赋值要多占1个字节,用于存放字符串结束标志'\0';'\0'由编译系统自动加上的 gcc编译过程gcc-Ehell......
  • sql注入基础
    sql注入           意义是:用户在提交表单时输入恶意的sql语句,欺骗后端把其当作正常的数据执行 注入方式分类有两种         按照注入方式分:union注入、布尔盲注、时间注入、报错注入         按照注入点类型分:字符型、数字型  一、按......