消息队列(Kafka及RocketMQ等对比联系)

news2025/3/29 14:16:20

目录

消息队列

一、为什么使用消息队列?消息队列有什么优点/缺点?介绍下Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优点缺点,如何取舍?

1.公司业务场景是什么,这个业务场景有什么挑战,如果不用MQ有什么麻烦,现在用了MQ有什么好处

2.消息队列优点:

解耦(担心挂)

异步

削峰

3.消息队列缺点:

整个系统可用性降低(外部依赖变多,MQ挂了,系统挂了);复杂度变高(需要注意消息重复,消息遗漏,消息顺序);引入了一致性问题(A系统完成返回成功,用户以为成功,但B/C/D系统哪里某个失败了,那就数据不一致了)

系统复杂度提高,可用性下降,还需要保证一致性

所以需要额外的架构来规避上述问题

4.Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优点缺点,如何取舍?

中小型公司用rabbitmq,社区活跃,基本满足需求;大型公司研发能力雄厚,可用rocketmq;大数据实时领域用kafka很标准;

二、如何保证消息队列的高可用性?

RabbitMQ(主从架构)

镜像集群模式,是每个节点上都有queue和数据。写消息到queue时,会自动把消息同步到多个实例的queue上。

Kafka(切分消息+replica副本机制)

broker,topic,partition,repilication

三、如何保证消息不被重复消费?如何保证消费消息的幂等性?(全局唯一标识ack /offset)

1.消息自己该有全局唯一标识,rabbitmq是ack,kafka是offset,记录下来每次消费到哪个号码了

2.结合业务,避免重复消费产生影响。比如数据库的唯一键/主键,比如搭配redis

四、如何保证消息不会丢失?

三个可能性,生产者发送给MQ时丢失了;MQ自己丢失了;MQ发给消费者丢失了

生产端弄丢了数据(事务机制 offset)

MQ弄丢了数据(元数据持久化+confirmed机制)

消费端弄丢了数据(关闭自动提交offset)

关闭自动提交offset,重复消费保证幂等性

brocker宕机,重新选举partition的leader,但其他follower还没同步好数据,就会有数据丢失的问题

五、如何保证消息的顺序性?(写入的顺序、读取的顺序)

消息是顺序性有两个方面,一个是写入消息的顺序,一个是读取的顺序

写入时要保证顺序,key来确认分配到哪个partition,一个partition对应一个消费者,

rabbitmq   queue

 kafka  一个topic,一个partition,一个consumer,内部单线程消费,这种吞吐低。

六、消息如果延时了或者处理过慢或者积压了几百万消息或者过期了怎么解决

七、如果让你写一个消息队列如何进行架构设计?

系统可拓展性

数据落地磁盘

mq的高可用性

数据0丢失

Kafka

基本概念

角色术语

Broker

Topic

Record

Partition

Offset

Replica

Producer

Consumer

Consumer Offset

Consumer Group

Rebalance

ISR

HW

LEO

拓扑架构

Topic、Partition、Segment、.log、.index、Message

Kafka分布式集群构建

核心设计原理


消息队列

  • 一、为什么使用消息队列?消息队列有什么优点/缺点?介绍下Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优点缺点,如何取舍?

    • 1.公司业务场景是什么,这个业务场景有什么挑战,如果不用MQ有什么麻烦,现在用了MQ有什么好处

      • 进行投后业务场景后端从sqlServer无感知切花u你Mysql其中的数据校验。这个业务场景的挑战点就在于如何在真实场景中验证业务逻辑(写操作)的正确性,并保证不影响运营数据的维护,确保上线无问题。这就需要一套前端,一个操作,触发两个请求,一个是原有sqlserver 的请求,另一个是对Mysql数据库操作,主要利用了消息队列实现了双写操作,确保了原有运营数据的正常维护并且后端人员能在最真实最全面的待上线系统中实时进行数据对比
    • 2.消息队列优点:

      • 解耦(担心挂)
        • 通过发布订阅消息这个模型,使系统与系统之间解耦,挂了也不影响整体,
      • 异步
        • Mysql双写
      • 削峰
        • 有些时间段业务繁忙,但实际并不需要非常快速响应,可以利用消息队列实现均匀处理消息,保证节点不会挂
    • 3.消息队列缺点:

      • 整个系统可用性降低(外部依赖变多,MQ挂了,系统挂了);复杂度变高(需要注意消息重复,消息遗漏,消息顺序);引入了一致性问题(A系统完成返回成功,用户以为成功,但B/C/D系统哪里某个失败了,那就数据不一致了)
      • 系统复杂度提高,可用性下降,还需要保证一致性
      • 所以需要额外的架构来规避上述问题
    • 4.Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优点缺点,如何取舍?

      •  
      • 中小型公司用rabbitmq,社区活跃,基本满足需求;大型公司研发能力雄厚,可用rocketmq;大数据实时领域用kafka很标准;
  • 二、如何保证消息队列的高可用性?

    • RabbitMQ(主从架构)

      • 有几种模式,第一种普通集群模式,是一个元数据queue存储信息,消费者拉数据访问到其他节点时,其他节点到queue所在节点拉数据,复制到其他节点再返回。
      • 镜像集群模式,是每个节点上都有queue和数据。写消息到queue时,会自动把消息同步到多个实例的queue上。
        • 网络传输开销大;而且这样对于大消息是存储不了的,存储方面有瓶颈
    • Kafka(切分消息+replica副本机制)

      • broker,topic,partition,repilication
      • kafka由多个broker构成,每个broker是一个节点;一个topic可以划分为多个partition,每个partition可以存在于不同的broker上,每个partition就放一部分数据。(切分消息了,真正的分布式)
      • kafka0.8以后,多了replica(复制品)副本机制。每个partition的数据都会同步到其他broker上,并且选举leader,leader负责同步data到follower;生产和消费都只跟leader沟通,保证数据一致性。
        • 写数据时,生产者写leader,leader将数据落入本地磁盘,接着其他follower自己主动到leader来Pull数据,一旦所有follower同步好数据,就会发送ack给leader,leader收到所有follower的ack后,就会返回写成功的消息给生产者。
        • 读数据时,读leader,leader如果挂了,就重新选举leader,读新leader;但是只有当一个消息已经被所有follower都同步成功返回ack的时候,才会被消费者读到。
  • 三、如何保证消息不被重复消费?如何保证消费消息的幂等性?(全局唯一标识ack /offset)

    • 1.消息自己该有全局唯一标识,rabbitmq是ack,kafka是offset,记录下来每次消费到哪个号码了
    • 2.结合业务,避免重复消费产生影响。比如数据库的唯一键/主键,比如搭配redis
  • 四、如何保证消息不会丢失?

    • 三个可能性,生产者发送给MQ时丢失了;MQ自己丢失了;MQ发给消费者丢失了

    • 生产端弄丢了数据(事务机制 offset)
      • rabbitmq(事务机制)
        • 生产者开启事务机制,得到确认才commit,否则rollback(同步的)
          • 吞吐量下来,耗性能
        • 生产者开启confirmed机制,每个消息有唯一id,一段时间没有得到ack就重发该消息。(异步的)
      • kafka
        • offset,发送到哪记录下
    • MQ弄丢了数据(元数据持久化+confirmed机制)
      • rabbitmq
        • 开启rabbitmq元数据queue的持久化和消息的持久化,持久化到磁盘
        • confirmed机制和持久化搭配起来,只有消息被持久化到磁盘,才发送ack通知生产者
    • 消费端弄丢了数据(关闭自动提交offset)
      • kafka
        • 关闭自动提交offset,重复消费保证幂等性
        • brocker宕机,重新选举partition的leader,但其他follower还没同步好数据,就会有数据丢失的问题
          • 1.给topic的partition设置副本数要大于等于2
          • 2.在producer端设置acks=all,要求每条数据必须写入所有replica后,才能认为是写成功了
            • acks=0,1,all 分别代表的情况
          • 3.在producer端设置reties=MAX,要求一旦写入失败则无限充实
          • 4.给kafka服务端设置min.insync.replicas>=1,要求一个leader感知到治沙一个follower还跟自己保持联系没掉队,这样才能确保Leader挂了还有一个follower
  • 五、如何保证消息的顺序性?(写入的顺序、读取的顺序)

    • 消息是顺序性有两个方面,一个是写入消息的顺序,一个是读取的顺序

    • 写入时要保证顺序,key来确认分配到哪个partition,一个partition对应一个消费者,
    • rabbitmq   queue
      • 拆分为多个queue,每个queue对应一个consumer;或者就一个queue,一个consumer,该consumer内部用内存队列排队,分发给不同的worker来处理
    •  kafka  一个topic,一个partition,一个consumer,内部单线程消费,这种吞吐低。
      • 一个topic,一个partition,一个consumer,内部单线程消费,这种吞吐低。
      • 写N个内存queue,具有相同key的数据都到同一个内存queue,但是对于N个线程,每个线程分别消费一个内存queue即可。(多个queue,多个线程,但是queue与线程1V1)
  • 六、消息如果延时了或者处理过慢或者积压了几百万消息或者过期了怎么解决

    • 1.解决消费端报错,回复consumer消费速度

    • 2.征用机器,扩大partition到十倍,consumer到十倍,十倍速度进行快速消费(临时分发数据的consumer程序中,消费之后不做耗时处理,直接均匀轮询写入临时建立好的10倍数量的的queue)
    • 3.快速消费后,恢复原先部署的架构
    • 过期:设置过期实践ttl;写代码捞丢失的数据
    • 快写满了:先用1,2,3进行快速消费数据,然后晚上再补捞数据
  • 七、如果让你写一个消息队列如何进行架构设计?

    • 系统可拓展性

      • 分布式的,便于快速拓展,数据切分,数据副本机制
      • kafka的设计理念:broker->topic->partition,每个partition存放一个机器,存一部分数据,资源不够,给topic增加partition,做数据迁移,增加机器
    • 数据落地磁盘

      • 顺序写,避免磁盘随机读写的寻址开销。磁盘顺序读写的性能高
    • mq的高可用性

      • replica副本机制->leader&follewer->broker挂了重新选举Leader即可对外服务
      • 消费端Rebalance,某消费者实例挂掉后,再均衡分配实例
    • 数据0丢失

      • 数据多了怎么办,大了怎么办,丢了怎么办,重复消费了怎么办,过期了怎么办,保证顺序怎么办

  • Kafka

    • 基本概念

      • 高吞吐的分布式发布/订阅消息系统,即 为不同系统之间传递消息的
      • 存储系统,得益于 其消息持久化功能和多副本机制
      • 分布式流处理平台,有完整的流式处理类库
    • 角色术语

      • Broker

        • 数据存储中心。每个kafka集群包含一个或多个服务器,每个服务器被称为broker
      • Topic

        • 每条发布到Kafka集群的消息都有个分类,类别即为Topic(主题),用来区分具体业务
      • Record

        • 消息
      • Partition
        • 每个Topic包含一个或多个Partition,每个Partition都是有序不变的队列,Partition中的每条消息都会被分配一个唯一ID (称为offset)
      • Offset

        • 每条消息的位置信息,单调递增且不变的量
      • Replica

        • 副本,数据冗余,高可用
      • Producer

        • 消息的生产者,负责发布消息push到kafka broker
      • Consumer

        • 消息的消费者,负责到broker去pull消息来消费
      • Consumer Offset

        • 消费者位移,代表消费进度
      • Consumer Group

        • 消费者组,可以给每个consumer指定消费者组,若不指定,则为默认的group。同时消费多个Partition以实现高吞吐
      • Rebalance

        • 再平衡。消费者组内某个消费实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance是Kafka消费者端实现高可用的重要手段。
      • ISR

        • In-Sync Replica Set.ISR集合代表每个分区的一组同步集合,处于 ISR 集合中的副本,意味着 follower 副本与 leader 副本保持同步状态,只有处于 ISR 集合中的副本才有资格被选举为 leader
      • HW

        • HightWatermark,水位线,指的是消费者能见到的最大的offset,ISR队列中最小的LEO
      • LEO

        • Log End Offset, 指的是每个副本最大的offset;
    • 拓扑架构

      • 多个producer,多个broker,多个 consumer group,外加一个zookeeper。zookeeper来进行管理集群配置,选举Leader,在Consumer Group发生变化时进行rebalance。
      • Producer push 消息 发布到broker,consumer使用pull模式从broker订阅并消费消息。
      • 生产者将消息分布到不同broker上的不同partition上,消费者可以消费集群中多个节点的多个partition。
        • 写消息时,允许多个生产者写道同一个partition中
        • 但读消息时,一个partition只能被一个消费者组的一个消费者读,但是可以同时被其他消费组读取。(消费者组内的消费者读partition互斥)
      • 支持消息持久化存储。持久化数据存储在log日志文件中。(先缓存在内存,到达一定阈值再统一写入磁盘,减少磁盘IO调用次数)
      • 消息写入Partition,是顺序写入磁盘的,避免随机读写的 “寻头”磁头不停移动(磁盘的性能瓶颈之一,SSD例外)
    • Topic、Partition、Segment、.log、.index、Message

      • topic的partition数字决定了组成topic的log的数量,>=同时运行的consumer,>集群broker的数量,尽可能均匀分布在broker中
      • kafka是基于文件存储的,partition可用来拆分topic,将大量消息分成多批写到不同节点上,均衡负载。
      • 每个partition对应一个文件夹,存储该partition的消息,以大小相等的segment文件夹为单位,内容为 消息索引(.index)和消息数据(.log)。partition命名为topic+序号(0,1,...)
      • Partition文件夹的命名,Segment文件夹的命名,.index 和 .log的切分和命名
      • Message的物理结构
    • Kafka分布式集群构建

      • kafka2.8.0版本中移除了对Zookeeper的依赖,通过KRaft进行自己的集群管理。
      • 一些配置参数:
        • brocker.id
          • 若服务器ip地址变化时,只要brocker.id没有变,就不会影响consumer的消费
        • log.dirs
          • 配置kafka保存数据的位置
        • num.partitions
          • topic的分区数,过小会影响性能
        • logs.segment.bytes
          • 配置每个segment数据文件的大小,默认是1G,超过这个大小会自动创建一个新的segment
        • delete.topic.enable
          • 在0.8.2版本之后,kafka提供的删除topic 的功能,但是默认不会物理删除topic数据。如果需要物理删除,设为true
        • acks
          • 指定必须多少个分区副本收到消息,生产者才会认为写入消息是成功的。(对消息丢失的可能性有重大影响)
            • acks=0:写入消息之前不会等待任何来自服务器的响应,容易丢消息,但是吞吐量高
            • aks=1(leader):只要集群的leader节点收到消息,生产者就会收到来自服务器的成功响应。可靠性中等,leader如果发生问题,follower未来得及同步,就会丢失部分数据
            • acks=-1(all):只有当所有参与复制的节点都收到消息,生产者才会收到一个来自服务器的成功响应。延迟高。
    • 核心设计原理

      • 存储机制
      • 备份和副本机制
      • 日志设计
      • Controller控制器
      • Rebalance
      • 可靠性设计
      • 延迟、死信、重试队列等

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

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

相关文章

GitHub开源的容器管理面板-Dpanel

dpanel Docker安装部署二进制部署 GitHub官网 一块轻量化docker可视化管理面板,由国人开发,个人觉得是比较好用的,功能都很齐全,并且可以通过修改源码,自定义前端样式等。 Docker安装部署 官网 部署环境&#xff1…

【HarmonyOS Next】三天撸一个BLE调试精灵

【HarmonyOS Next】三天撸一个BLE调试精灵 一、功能介绍 BLE调试精灵APP属于工具类APP,在用户使用的过程中,负责调试BLE设备从机端,比如蓝牙耳机、低功耗设备、带有BLE的空调等设备,可以在页面中清晰看到设备的厂商,…

java 批量下载doc\excle\pdf

指定图片集合 下载到指定文件夹 import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.Arrays; import java.util.List;public class OfficeFileDownloader {/*** 需要下载的Office文档URL列表*/private static final List<Strin…

软件性能效率测试工具有哪些?专业第三方软件检测机构推荐

在软件开发的新时代&#xff0c;软件性能效率测试已经成为每个企业不可或缺的一部分。无论是在竞争激烈的市场中&#xff0c;还是在追求卓越用户体验的过程中&#xff0c;都需要进行有效的性能测试。 一、软件性能效率测试的目标   1、响应时间&#xff1a;确保用户请求的响…

使用flask_restful快速构建接口

Flask-RESTful 是一个用于快速构建 RESTful API 的 Flask 扩展。它简化了创建、管理和文档化 REST API 的过程。利用 Flask-RESTful&#xff0c;你可以更容易地将你的 Flask 应用程序组织成 RESTful 原则的风格 安装包 pip install flask_restful 快速构建接口 from flask im…

centos 7 部署FTP 服务用shell 搭建脚本,使用时稍微修改自己所需需求

#!/bin/bash # 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; then echo "此脚本需要以 root 用户身份运行。" exit 1 fi # 安装 vsftpd yum install vsftpd -y # 备份原始配置文件 cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd…

Hadoop集群搭建(hdfs、yarn)

Hadoop 是 Apache 软件基金会旗下的一个开源项目&#xff0c;是用于处理大数据的分布式系统基础架构&#xff0c;被广泛应用于大数据存储、处理和分析等场景。 一、核心组件 1、Hadoop 分布式文件系统&#xff08;HDFS&#xff09; 具有高容错性&#xff0c;能在低成本硬件上…

Keepalived 实现高可用方案

Keepalived简介 ‌Keepalived‌ 是一个基于 ‌VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;协议‌的高可用性解决方案&#xff0c;主要用于实现‌服务故障自动切换&#xff08;Failover&#xff09;和负载均衡‌。通过管理虚拟 IP&#xff08;VIP&#xf…

医学图像分割数据集肺分割数据labelme格式6299张2类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图像分辨率&#xff1a;1024x1024 图片数量(jpg文件个数)&#xff1a;6299 标注数量(json文件个数)&#xff1a;6299 标注类别数&#xff1a;2 标注类别名称:["leftl…

C语言复习笔记--函数递归

在学习了函数之后,函数递归是我们必然会接触到的课题,下面就让我们看下函数递归相关的知识. 递归是什么&#xff1f; 递归这个词看着就不那么好理解,那么什么是递归呢?递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数自己调用自己. 写⼀个史上最简单的C语⾔递归代码: …

husky的简介以及如果想要放飞自我的解决方案

husky 是一个 Git Hooks 管理工具&#xff0c;它的主要作用是 在 Git 提交&#xff08;commit&#xff09;、推送&#xff08;push&#xff09;等操作时执行自定义脚本&#xff0c;比如代码检查&#xff08;Lint&#xff09;、单元测试&#xff08;Test&#xff09;、格式化代码…

侯捷 C++ 课程学习笔记:现代 C++ 中的移动语义与完美转发深度解析

1. 前言&#xff1a;为什么我们需要移动语义&#xff1f; 在侯捷老师的《C11/14/17 新特性详解》课程中&#xff0c;移动语义&#xff08;Move Semantics&#xff09;被称作"C近十年来最重要的革新"。传统C中饱受诟病的深拷贝性能问题&#xff0c;在现代C中通过移动语…

23种设计模式-结构型模式-适配器

文章目录 简介场景问题解决方案建立中间转换层关键收益 总结 简介 使接口不兼容的类实现协同工作&#xff0c;通过引入中间层实现客户端接口和服务端接口的兼容。典型场景比如整合第三方类库或遗留系统时保持代码兼容。 场景 假设你正在开发一个股票监控程序。这个程序会下…

美亚科技业绩波动明显:现金流为负,四起未决诉讼涉金额1700万

《港湾商业观察》施子夫 近期&#xff0c;广东美亚旅游科技集团股份有限公司&#xff08;以下简称&#xff0c;美亚科技&#xff09;披露第二轮审核问询函的回复。从两轮问询函监管层提出的问题来看&#xff0c;有关美亚科技业绩增长的合理性、募投项目的必要性及合理性、经营…

PyTorch 深度学习实战(21):元强化学习与 MAML 算法

一、元强化学习原理 1. 元学习核心思想 元强化学习&#xff08;Meta-RL&#xff09;旨在让智能体快速适应新任务&#xff0c;其核心是通过任务分布学习共享知识。与传统强化学习的区别在于&#xff1a; 对比维度传统强化学习元强化学习目标解决单一任务快速适应任务分布中的…

23中设计模式-迭代器(Iterator)设计模式

迭代器设计模式 &#x1f6a9;什么是迭代器设计模式&#xff1f;&#x1f6a9;迭代器设计模式的特点&#x1f6a9;迭代器设计模式的结构&#x1f6a9;迭代器设计模式的优缺点&#x1f6a9;迭代器设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

Word中公式自动标号带章节编号

&#xff08;1&#xff09;插入一行三列的表格&#xff0c;设置宽度分别为0.5&#xff0c;13.39和1.5&#xff0c;设置纵向居中&#xff0c;中间列居中对齐&#xff0c;最右侧列靠右对齐&#xff0c;设置段落如下 &#xff08;2&#xff09;插入域代码 【Word】利用域代码快速实…

【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权主体功能开发

系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目&#xff08;含完整前端后端代码&#xff09;【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲&#xff1a;核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…

[7-01-03].SpringBoot3集成MinIo

MinIO学习大纲 一、Spingboot整合MinIo 第1步&#xff1a;搭建SpringBoot项目&#xff1a; 第2步&#xff1a;引入minio依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&q…

ISIS-3 LSDB链路状态数据库同步

上一章我们介绍了ISIS的邻居建立关系以及ISIS的路由器角色有哪些,在不同的网络类型当中建立邻居关系有什么不同,并且以实验案例抓包的形式给大家进一步介绍了建立的过程。 这一章我们来介绍ISIS中是如何实现链路状态数据库同步的,与OSPF的链路状态同步有什么不同,在不同网络类…