MQ集合了

消息队列,FIFO  :异步  解耦   削峰

复杂度上升 幂等 重复消费 消息丢失 / 可用性降低 mq故障 / 一致性要求

mq对比:

  activeMQ:jms规范,支持事务 xa协议 

  rabbitMQ:erlang 性能👌 高并发 多语言 amqp协议 吞吐量低不易堆积(ait)

      镜像队列:集群  blockingqueue存储数据,commit/rollback/ack

      死信队列:被消费者否定 requeue=false,在队列存活时间超过ttl,消息数量超过max队列长度

          死信交换机direct fanout topic

      延迟队列:设置了ttl 消息最大存活时间 

      直连队列:直连queue,生产者消费者相同参数声明队列

  kafka:高性能 高可用 大规模使用 单机容量有限  吞吐量百万 (livu)

  

  rocketMQ:java实现 高可用 可靠 单机十万(商城)

  • nameServer producer consumer broker 
  • b 启动时向all的nameServer注册,长连接 30s一次心跳
  • p发送消息时从nameServer获取broker服务器地址,负载均衡选服务器发送消息
  • c消费消息 从n获取b地址,主动拉取来消息

异步发送消息,先缓存 达到一定数量 批量发送

pull和push:

  pull主动拉,消费者自己决定 控制速率,不及时 

  push:broker主动推,实时推送,消费者压力大

高可靠:

不多发 不少发,不重复消费 broker持久化 ack机制

消息发送可靠

  ack = 0不重试 1 leader写入成功就返回  all/-1等待isr同步完

  unclean.leader.election.enable:false 禁止isr以外follower成为leader

  tries>1

  min.insync.replicas>1同步副本数,没满足前 不提供读写 写异常  

消费可靠:

  手工提交offset

broker可靠:pageCache 然后刷盘

  减少刷盘间隔,insync;事务消息 commit rollback

rabbitMQ:

  • 事务消息
  • 消息确认
  • 发送方设置channel=confirm模式,消费分配id ,信道ack回调confirmCallback,如错误nack 回调returnCallback
  • 接收方声明队列noack=false,broker等待消费者手动ack;broker的ack无超时机制只判断连接是否断开,断了 重新发送另一个 去重

消息不丢失

rockerMQ

  生产者:1.同步阻塞发送 失败重试(broker存储失败) 

     2.异步发送回调 校验发送结果 

     3.ack机制,commitLog,存储consumerQueue失败 (风险)

 broker:1.同步刷盘  集群模式同步 等待slave复制完成才返回确认 

 消费者:1.offset手动提交  2.消费保证幂等

环节上:

生产者不丢失

  发送+回调 

  rocketMQ:半事务 ack确认 

  rabbitMQ:手动事务 channel txSelect开启 txCommit提交 txRollback回滚 阻塞式

消息同步不丢失

   rocketMQ:普通集群配置  同步同步  异步同步

        dledger:两阶段提交

   rabbitMQ:普通集群 分散存储 不会主动同步

        镜像集群:节点间主动数据同步

   kafka:容许少量丢失 acks参数 0 1 all

MQ存盘不丢失

   rocketMQ:配置 同步/异步

   rabbitMQ:持久化队列 3.x quorum队列采用raft协议消息同步(两阶段方式)

MQ消费消息不丢失

 rocketmq:默认消费方式 不异步

 rabbitmq:autoCommit — 手动提offset

 kafka:手动提交offset  

不重复消费

幂等,标识 

高性能

 基于硬盘,消息堆积能力强

 顺序写:磁盘顺序访问速度接近内存 append操作 partition有序的 节省寻道时间

     批量操作 节省写入次数

     partition物理上分多个segment存储,方便删除  

 零拷贝:将内核缓冲区数据发送到网卡传输

    传统:读取磁盘文件 到 内核缓冲区 copy用户缓冲区  copy到socket发送缓冲区   发送网卡 

    Mmap的MappedByteBuffer 1.5g-2g

    transfile通过FileChannel 无文件限制

       rocketMQ:Mmap方式读写

       kafka:index日志Mmap读写,其他日志无零拷贝;transfile将硬盘数据加载网卡

 操作系统pageCache ;如果生产消费速率相当 直接用pageCache 不需要磁盘IO

zk:老版本

/brokers/ids临时节点 所有broker节点信息,物理地址 版本 启动时间 brokerID 定时发心跳

/brokers/topics:临时节点

   子节点一个固定partitions节点 子节点上topic分区 保存state节点 leader分区 isr的brokerId

/consumers/group-id/owners/topic/broker_id-partion_id:消费者和分区的注册关系

/consumers/group-id/offsets/topic/broker_id-partion_id:分区消息消费进度offset

消费者 state 找到broker的绑定关系 

分布式事务:最终一致性

生产者100%消息投递,消费者保证幂等消费 唯一id+校验

  at least once:至少一次确认 发

  at most once:最多发一次

  exactly once:rocketMQ商业版本提供

rabbitMQ:事务消息

 信道设置:

    channel.txSelect开启事务,服务器返回tx.select-ok

    basicPublish发送多条消息,

    txCommit提交

    txRollback回滚   

 消费者使用事务:

    autoAck=false 手动ack

rocketMQ:两阶段

 transactionListener接口:

    executeLocalTransaction发送消息后调用 执行本地事务 成功 再提交消息

    checkLocalTransaction本地事务检查,rocketmq依赖此做补偿

 两阶段:

  prepare:将消息投递给rms_sys_trans_half_topic的topic

  commit/rollback:product通过executeLocalTransaction执行事务 据结果向broker发送commit/rollback,commit则rms_sys_trans_half_topic的消息投递到真实topic,删除消息投递rmq_sys_trans_op_half_topic中表示事务完成,如果rollback则只投递删除消息

消息顺序性:

只需要保证局部有序,不需要全局有序

rocketMQmessageSelector一组有序消息放到同一个队列 消费者一次消费整个队列

    发送 消费同一queue

    发送保证顺序,消息体上设置消息顺序

      发送者实现messageQueueSelector接口,选择queue

         selectMessageQueueByHash按参数hash与可选队列 求余选择

         selectMessageQueueByRandom:随机选择

    mq:本身顺序追加 一个队列一个时间一个consumer消费 加锁 consumer上的顺序消费有一个定时任务来请求延长锁定

   消费者:pull模式 顺序拉取消息 顺序消费

      push实现mqPushConsumer接口,注册监听消息消息,registerMessageListener

           messageListenerConcurrently并行消费

           messageListenerOrderly串行消费 consumer会吧消息放入本地队列并加锁 定时任务锁同步

rabbitMQ:一个目标exchange只对应一个队列,一个队列只对应一个消费者

kafka:生产者定制partition分配规则,将消息分配同一partition,topic只对应一个消费者

其他:

rocketMq:每个消息 messageId 消费者自己判断,数据量大不保证唯一

延时队列:指定时间被处理的元素的队列,过期性操作的业务

kafka副本同步

partino

  leo下一跳消息写入位置

  hw前的数据可见,isr列表分区信息,

  firstUnstableOffset第一条未提交的数据 ,lastStableOffset最后一条提交的数据

      isolation.level=read_committed消费到lastStableOffset,read_uncommitted

  

kafka的rebalance机制

避免,consumer group中消费者 与 topic下的partion 重新匹配

   group 成员个数变化 / 消费超时 / group订阅topic个数变化 / group订阅topic分区数变化

coordinator:partition的leader所在broker 监控group中consumer存活 维持心跳 判断消费超时

   心跳返回通知consumer进行rebalance

   consumer请求coordinator加入组,coordinator选举leader consumer

   leader从coordinator获取所有consumer,发送syncGroup分配信息给coordinator

   coor心跳将syncGroup下发给consumer

leader consumer监听topic变化,通知coordinator 触发rebalance

  C1消费超时 rebalance 重新分配 消息被其他消费 C1完成提交offset 

     coordinator每次rebalance,标记一个generation给consumer,每次rebalance该generation+1,consumer提交offset时,coordinator对比generaton 不一致拒绝提交

rabbitMQ

持久化

 交换机持久化:exchange_declare 参数

 队列持久化:queue_declare 参数

 消息持久化:new AMOPMessage 参数

 append写文件 据大小自动新文件,两个进程一个持久化存储,另一个非持久化存储(内存不够)

 存储:ets表记录消息在文件中的映射关系:id 偏移量 有效数据 左边文件 右边文件 

 删除:从ets删除,垃圾数据 超出50% 文件数>3 垃圾回收,锁定左右两个文件 整理 更新 合并

 先写buffer缓冲区,buffer满 写入文件(操作系统页) 25ms刷盘 buffer+页 落盘

交换机

先找到绑定的队列在判断routekey,发到哪个队列

    routerKey/bindid

fanout扇形交换机 不判断routekey 直接发送绑定的队列 发布订阅

direct:routekey是否完全匹配,

topic:模糊匹配 routekey

header:队列 交换机指定键值对 交换机分发消息 先解开消息体headers数据 是否设置键值对 匹配成功 发送到队列 ,性能差

普通集群

元数据:

  队列:名称和属性

  交换器:名称 类型 属性

  绑定元数据:简单表哥展示如何将信息路由到队列

  vhost元数据:vhost内队列 交换器 提供命名空间和安全属性

客户端连接到非队列所在节点 ,路由转发 发送和消费

节点类型:

   磁盘节点:配置信息 元信息 存储在磁盘

   内存节点:配置信息 和元信息存储在内存,依赖磁盘节点持久化

至少一个磁盘节点,节点加入离开必须通知磁盘节点,唯一的磁盘崩溃 集群可保持运行 但不能改东西:创建队列 交换器 绑定 用户 数据

架构

bingkey:exchange与queue绑定关系

routingkey:producer指定,交换机拿到 和bingkey 联合 

信道:connnection 虚拟连接 amqp信道 长连接

rocketMQ

持久化

commitlog:所有的queue共享,1g 加锁 再写; 写满重生生成 顺序写

   避免分区过多 日志文件过多磁盘IO读写压力大 

consumeQueue:逻辑queue,消息先到commitlog,异步转发consumeQueue,物理偏移位置offset 内容大小 messageTag的hash值 600w个字节

indexFile:key 时间区间查找commitlog消息,文件名 创建时间戳命名 400m 2000w索引

  queue存储少量数据,轻量化,串行化访问磁盘 

  顺序写 随机读 先读consumeQueue 再读commitLog 降低读效率

同步刷盘:持久化再ack

异步刷盘:pageCache再ack

设计MQ

message对象   可伸缩FIFO队列  分布式队列 

producer:消息体 标识id 类型 长度 

exchange:队列 丰富路由策略 提前缓冲好对应关系 删除机制

queue:队列 内存 异步持久(数据库) 删除机制

consumer:集群 topic下partion,配置一对多 多对多 一对一消费模式 是否自动ack

java的Mmap的MappedBetyBuffer零拷贝 commitlog  consumerLog 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react-router v6的Link组件relative属性解释

Link组件有一个名为relative的属性,值为route或path,默认为route 当Link的to为两个点时,配置relativeroute|path会有不同的效果, 之前由于路径嵌套不够深,看不出区别,于是尝试加深路径,一眼就看出了区别 官方解释 | React Router6 中文文档 下方代码请看根路径/cd及其二级路…

C++优先队列——priority_queue,函数对象,labmda表达式,pair等

头文件&#xff1a;#include<queue> 内部使用堆来实现&#xff0c;在需要或得最大的几个值或最小的几个值而不关心整个数组的顺序时非常好用。 用法&#xff1a; priority_queue<int, vector<int>, greater<int>>q; 第一个参数为堆中存储的元素。 …

vue 借助vue-amap插件对高德地图的简单使用

需求&#xff1a;实现点击获取经纬度、定位、对特殊位置标点及自定义信息窗体功能。 高德地图的官网API&#xff1a;概述-地图 JS API 1.4 | 高德地图API vue-amap的中文文档&#xff1a;组件 | vue-amap 实现&#xff1a; 1、安装vue-amap插件 npm install vue-amap --save…

AI预测福彩3D第20弹【2024年3月28日预测--第4套算法重新开始计算第6次测试】

今天继续对第4套算法进行测试&#xff0c;测试的目的主要是为了记录统计两套方案的稳定性和命中率&#xff0c;昨天的第二套方案已命中。今天是第5次测试&#xff0c;同样测试两个方案。废话不多说&#xff0c;直接上结果。 2024年3月28日福彩3D的七码预测结果如下 …

武忠祥《660题》高效刷题包+资料分享

660题的难度书虽然比较难&#xff0c;对于基础的考察比较深入&#xff0c;所以&#xff0c;有没有一种可能&#xff0c;做题太慢&#xff0c;是因为基础不好导致的&#xff01; 所以再继续做下去&#xff0c;就没有什么意义了&#xff0c;因为这就像是用一把钝刀去砍树&#x…

mybatis搭建开发环境

1.创建maven工程 2.配置pom.xml <!--数据库驱动--> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version> </dependency> <!--Mybatis--> <depend…

vscode使用sftp上传

1.用vscode打开项目 2.安装一下这个sftp 3.使用快捷键 ctrlshiftP 打开指令窗口&#xff0c;输入 sftp:config&#xff0c;选中回车&#xff0c;在当前目录中会自动生成 .vscode 文件夹及 sftp.json 4.修改sftp.json文件配置&#xff0c;改成以下&#xff08;默认的参数可能上传…

八种顺序读写函数的介绍(fput/getc;fput/gets;fscanf,fprintf;fwrite,fread)

一&#xff1a;读写的含义的解释&#xff1a; 读&#xff08;读出&#xff09;&#xff1a;即从文件里面读出数据----------->和scanf从键盘里面读出数据类似 写&#xff08;写入&#xff09;&#xff1a;即把数据写入文件里面----------->和printf把数据写入到屏幕上类…

【leetcode】双“指针”

标题&#xff1a;【leetcode】双指针 水墨不写bug 我认为 讲清楚为什么要用双指针 比讲怎么用双指针更重要&#xff01; &#xff08;一&#xff09;快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数…

Unity 窗口化设置

在Unity中要实现窗口化&#xff0c;具体设置如下&#xff1a; 在编辑器中&#xff0c;选择File -> Build Settings。在Player Settings中&#xff0c;找到Resolution and Presentation部分。取消勾选"Fullscreen Mode"&#xff0c;并选择"Windowed"。设…

Linux:Jenkins:参数化版本回滚(6)

上几章我讲到了自动集成和部署 Linux&#xff1a;Jenkins全自动持续集成持续部署&#xff08;4&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136977106 当我们觉得这个页面不行的时候&#xff0c;需要进行版本回滚&#xff0c;回滚方法我这里准备了…

Linux 反引号、单引号以及双引号的区别

1.单引号—— 单引号中所有的字符包括特殊字符&#xff08;$,,和\&#xff09;都将解释成字符本身而成为普通字符。它不会解析任何变量&#xff0c;元字符&#xff0c;通配符&#xff0c;转义符&#xff0c;只被当作字符串处理。 2.双引号——" 双引号&#xff0c;除了$,…

LangSAM项目优化,将SAM修改为MoblieSAM,提速5~6倍

Language Segment-Anything 是一个开源项目&#xff0c;它结合了实例分割和文本提示的强大功能&#xff0c;为图像中的特定对象生成蒙版。它建立在最近发布的 Meta 模型、segment-anything 和 GroundingDINO 检测模型之上&#xff0c;是一款易于使用且有效的对象检测和图像分割…

定时任务 之 cron 表达式

Cron 表达式产生的背景&#xff1a;在Unix系统中&#xff0c;用户经常需要设置一些周期性被执行的任务&#xff0c;如定期备份文件、发送邮件等。为了满足这种需求&#xff0c;Unix系统提供了crontab命令&#xff0c;允许用户定义任务的时间表&#xff0c;并在指定的时间点自动…

实现实时查询并带有查询结果列表的输入框

这个功能主要是实现了一个可以实时查询结果的搜索框&#xff0c;并具备点击外部关闭搜索结果框体的功能&#xff0c;除了v-show和transition依托于vue实现以外其余功能都基于原生JS实现。 效果图&#xff1a; 该功能的实现主要是很久之前面试被问到过&#xff0c;当时没有做出…

Linux:进程控制

进程创建 进程&#xff1a;内核的相关管理数据结构&#xff08;task_structmm_struct页表&#xff09;代码&#xff08;<-共享&#xff09;和数据(<-写时拷贝) fork函数初识 在 linux 中 fork 函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程…

1992-2022年经过矫正的夜间灯光数据

DMSP/OLS夜间灯光的年份是1992-2013年&#xff0c;NPP/VIIRS夜间灯光的年份是2012-2021&#xff0c;且由于光谱分辨率、空间分辨率、辐射分辨率、产品更新周期等方面的差异&#xff0c;DMSP-OLS和SNPP-VIIRS数据不兼容&#xff0c;也就是说我们无法直接对比分析DMSP-OLS和SNPP-…

Linux常用命令-文件操作

文章目录 ls基本用法常用选项组合选项示例注意事项 cd基本用法示例注意事项 pwd基本用法示例选项总结 cp基本用法常见选项示例注意事项 rm基本用法常见选项示例删除单个文件&#xff1a;交互式删除文件&#xff1a;强制删除文件&#xff1a;递归删除目录&#xff1a;交互式递归…

实验02-1 C#和ASP.NET控件:在Web窗体中输出九九乘法表

【实验内容及要求】 1. 在Web窗体中输出九九乘法表 浏览效果如图2-1所示。 图2-1 在Default.aspx.cs中编写C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls;public par…

项目四-图书管理系统

1.创建项目 流程与之前的项目一致&#xff0c;不再进行赘述。 2.需求定义 需求: 1. 登录: ⽤⼾输⼊账号,密码完成登录功能 2. 列表展⽰: 展⽰图书 3.前端界面测试 无法启动&#xff01;&#xff01;&#xff01;--->记得加入mysql相关操作记得在yml进行配置 配置后启动…