首页 > 其他分享 >阿里面试:canal+MQ,会有乱序的问题吗?

阿里面试:canal+MQ,会有乱序的问题吗?

时间:2024-07-11 09:53:24浏览次数:16  
标签:canal 顺序 分区 面试 MQ 消息 有序 乱序

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :

免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,完成职业升级, 薪酬猛涨!加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领

免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取


阿里面试:canal+MQ,会有乱序的问题吗?

尼恩特别说明: 尼恩的文章,都会在 《技术自由圈》 公号 发布, 并且维护最新版本。 如果发现图片 不可见, 请去 《技术自由圈》 公号 查找

阿里面试:canal+MQ,会有乱序的问题吗?

尼恩说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题:

canal+MQ,会有乱序的问题吗?

如何保证RocketMQ消息有序?

最近有小伙伴在面试阿里,又遇到了相关的面试题。

小伙伴懵了,因为没有遇到过,所以支支吾吾的说了几句,面试官不满意,面试挂了。

所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。

当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典PDF》V140版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】获取

1、如何保证消息顺序?

如何实现消息有序?实现顺序消息所必要的条件:顺序发送、顺序存储、顺序消费。

在MQ模型中,顺序需由3个阶段去保障

  1. 顺序发送: 发送时保持顺序一致
  2. 顺序存储: broker 存储时保持 顺序一致
  3. 顺序消费: 消费时 保持 顺序一致

2 消息有序的两大类型

有序消息,又叫顺序消息(FIFO消息),指消息的消费顺序和产生顺序相同。

如订单的生成、付款、发货,这串消息必须按序处理。

顺序消息又可分为全局有序和局部有序:

  • 全局有序:整个MQ系统的所有消息严格按照队列先入先出顺序进行消费
  • 局部有序:只保证一部分关键信息的消费顺序

2.1 全局顺序

一个Topic内所有的消息都发布到同一Q,按FIFO顺序进行发布和消费:

落地到RocketMQ,如何保证全局有序?

为了 保证Topic全局消息有序的方式,就是将Topic配置成只有一个唯一的MessageQueue队列, 默认是4个MessageQueue。

RocketMQ中,可以在发送者发送消息时指定一个MessageSelector对象,让这个对象来决定消息发入哪一个MessageQueue。这样就可以保证一组有序的消息能够发到同一个MessageQueue里。

适用场景

性能要求不高,所有消息严格按照FIFO进行消息发布和消费的场景。

2.2 分区顺序

对于指定的一个Topic,所有消息按sharding key进行区块(queue)分区,同一Queue内的消息严格按FIFO发布和消费。

  • Sharding key是顺序消息中用来区分不同分区的关键字段,和普通消息的Key完全不同。

落地到RocketMQ。而MessageQueue是RocketMQ存储消息的最小单元,他们之间的消息都是互相隔离的,在这种情况下,是无法保证消息全局有序的,但是可以保证局部有序。

默认的做法是,发送消息时,会通过MessageQueue轮询的方式保证消息尽量均匀分布到所有的MessageQueue上,而消费者也就同样需要从多个MessageQueue上消费消息。这就做不到局部有序。

对于局部有序的要求,只需要将有序的一组消息都存入同一个MessageQueue里,这样MessageQueue的FIFO设计天生就可以保证这一组消息的有序。

适用场景

性能要求高,根据消息中的sharding key去决定消息发送到哪个queue。

其实大部分的MQ业务场景,我们只需要保证局部有序就可以了。

例如

  • 我们用QQ聊天,只需要保证一个聊天窗口里的消息有序就可以了。

  • 而对于电商订单场景,也只要保证一个订单的所有消息是有序的就可以了。

2.3 对比

发送方式对比

存储方式对比

消费方式对比

  • 有序消费的消费者类型:ConsumeMessageConcurrentlyService 并发消费服务

  • 无序消费的消费者类型:ConsumeMessageOrderlyService

3 应用开发维度的实现消息有序需要做的工作:

实现顺序消息所必要的条件:顺序发送、顺序存储、顺序消费。 顺序存储环节,RocketMQ 里的分区队列 MessageQueue 本身是能保证 FIFO 的。

所以,在应用开发过程中,不能顺序消费消息主要有两个原因:

  • 顺序发送环节,消息发生没有序:Producer 发送消息到 MessageQueue 时是轮询发送的,消息被发送到不同的分区队列,就不能保证 FIFO 了。
  • 顺序消费环节,消息消费无序:Consumer 默认是多线程并发消费同一个 MessageQueue 的,即使消息是顺序到达的,也不能保证消息顺序消费。

我们知道了实现顺序消息所必要的条件:顺序发送、顺序存储、顺序消费。

顺序存储 由 Rocketmq 完成,所以,在应用开发层, 消息的顺序需要由两个阶段保证:

  • 消息发送有序
  • 消息消费有序

在这里插入图片描述

4:canal+MQ,如何实现有序?

Canal 是阿里巴巴开源的一个增量订阅和消费的中间件,用于基于 MySQL 的数据库增量日志解析(Binlog)。通过 Canal,可以实现对数据库的实时监控和数据同步。

我们在通过Canal把MySQL的Binlog数据发送到MQ(kafak/rocketmq)时,需要关注好几个环节:

  • Cannal 的有序监听。 Binlog本身是有序的,写入到mq之后如何保障顺序
  • Cannal 的有序发送。
  • 顺序存储: broker 存储时保持 顺序一致
  • 顺序消费: 消费时 保持 顺序一致

4.1 Cannal 的有序发送

canal目前支持kafka和rocketmq,在使用 Canal 进行数据同步时,保证数据的有序性是一个重要的问题,尤其是在分布式环境中。在 Kafka 或 RocketMQ 等消息队列中,消息的顺序性和分区策略至关重要。

canal 本质上都是基于本地文件的方式来支持分区级别的顺序消息,也就是binlog写入mq是可以有一定的顺序性保障,这个保障级别取决于用户的两个配置项:

  • canal.mq.partitionsNum
  • canal.mq.partitionHash

两个配置项 用于控制消息的分区和顺序。两个配置项介绍如下:

  1. canal.mq.partitionsNum
    • 描述:设置消息队列的分区数量。
    • 作用:决定了消息在消息队列中被分区的数量。不同的分区可以并行处理,但需要注意同一个分区内的消息是有序的。
  2. canal.mq.partitionHash
    • 描述:设置消息分区的哈希规则。
    • 作用:用于指定分区的哈希策略,可以根据特定的字段进行分区。例如,可以根据表名、主键等字段进行分区,以保证某些关键数据的有序性。

4.2 Cannal 的有序发送示例

假设我们希望将数据同步到 Kafka,并且需要保证某张表的数据是有序的,可以使用以下配置:

canal.mq.partitionsNum=10
canal.mq.partitionHash=my_database.my_table:id

配置解释

  1. canal.mq.partitionsNum=10
    • 表示消息会被分成 10 个分区。每个分区可以并行处理,从而提高处理效率。
  2. canal.mq.partitionHash=my_database.my_table
    • 针对 my_database.my_table 表的数据,根据 id 字段进行哈希分区。
    • 这样可以确保同一个 id 的所有变更都进入同一个分区,从而保证该 id 的变更顺序不变。

通过配置 canal.mq.partitionHash,分区内的消息是有序的,因此只要保证同一实体(如同一行数据)的变更进入同一个分区,就能保证其有序性。

4.3 Cannal 的使用场景

  • 实时数据同步:将数据库的变更实时同步到其他系统,如搜索引擎、缓存等。
  • 数据备份:实现数据库的实时备份,确保数据的一致性和完整性。
  • 事件驱动架构:在事件驱动架构中,利用 Canal 将数据库变更作为事件发布到消息队列,供其他系统消费。

通过合理配置 canal.mq.partitionsNumcanal.mq.partitionHash,可以在数据同步中既保证有序性,又提高处理效率。

尼恩《技术自由圈》多个核心MQ面试题

惊呆:RocketMQ顺序消息,是“4把锁”实现的(顺序消费)

阿里面试:如何保证RocketMQ消息有序?如何解决RocketMQ消息积压?

滴滴面试:Rocketmq消息0丢失,如何实现?

得物面试:消息0丢失,Kafka如何实现?

说在最后

至此,Canal+MQ的有序性方案,非常圆满了。

以上的内容,如果大家能烂熟于心、对答如流、如数家珍,基本上 面试官会被你 震惊到、吸引到。

最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,里边有大量的大厂真题、面试难题、架构难题。很多小伙伴刷完后, 吊打面试官, 大厂横着走。

在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

另外,如果没有面试机会,可以找尼恩来改简历、做帮扶。

遇到职业难题,找老架构取经, 可以省去太多的折腾,省去太多的弯路。

尼恩指导了大量的小伙伴上岸,前段时间,刚指导一个40岁+被裁小伙伴,拿到了一个年薪100W的offer。

狠狠卷,实现 “offer自由” 很容易的, 前段时间一个武汉的跟着尼恩卷了2年的小伙伴, 在极度严寒/痛苦被裁的环境下, offer拿到手软, 实现真正的 “offer自由”

技术自由的实现路径:

实现你的 架构自由:

吃透8图1模板,人人可以做架构

10Wqps评论中台,如何架构?B站是这么做的!!!

阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了

峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?

100亿级订单怎么调度,来一个大厂的极品方案

2个大厂 100亿级 超大流量 红包 架构方案

… 更多架构文章,正在添加中

实现你的 响应式 自由:

响应式圣经:10W字,实现Spring响应式编程自由

这是老版本 《Flux、Mono、Reactor 实战(史上最全)

实现你的 spring cloud 自由:

Spring cloud Alibaba 学习圣经》 PDF

分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)

一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)

实现你的 linux 自由:

Linux命令大全:2W多字,一次实现Linux自由

实现你的 网络 自由:

TCP协议详解 (史上最全)

网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!

实现你的 分布式锁 自由:

Redis分布式锁(图解 - 秒懂 - 史上最全)

Zookeeper 分布式锁 - 图解 - 秒懂

实现你的 王者组件 自由:

队列之王: Disruptor 原理、架构、源码 一文穿透

缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)

缓存之王:Caffeine 的使用(史上最全)

Java Agent 探针、字节码增强 ByteBuddy(史上最全)

实现你的 面试题 自由:

4800页《尼恩Java面试宝典 》 40个专题

免费获取11个技术圣经PDF:

标签:canal,顺序,分区,面试,MQ,消息,有序,乱序
From: https://www.cnblogs.com/crazymakercircle/p/18295453

相关文章

  • opc ua设备数据 转MQTT项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 准备工作 24 配置VFBOX网关采集OPCUA的数据 25 用MQTT协议转发数据 46 配置参数说明 47 上报内容配置 58 其他说明 89 案例总结 81 案例说明设置网关采集OPCUA设备数据把采集的数据转成MQTT协议转发给其他系统。2 VFBOX......
  • 利用SpringBoot+rabbitmq 实现邮件异步发送,保证100%投递成功
    在之前的文章中,我们详细介绍了SpringBoot整合mail实现各类邮件的自动推送服务。但是这类服务通常不稳定,当出现网络异常的时候,会导致邮件推送失败。本篇文章将介绍另一种高可靠的服务架构,实现邮件100%被投递成功。类似的短信自动发送等服务也大体相同。一、先来一张流程图......
  • 记一次springboot整合rabbitMQ的list序列化问题
    问题:平时传一个类的时候都会继承Serializable实现正确传输,这次我把list<Object>直接丢成了message,导致rabbitMQ不能序列化对象。报错org.springframework.amqp.rabbit.support.ListenerExecutionFailedException:Failedtoconvertmessage下面的整合步骤提供了解决方案:在发......
  • SpringBoot集成Rabbitmq快速启动示例
    RabbitMQ六种模式示例源码:ghdefe/rabbitmq-demo此项目分别演示六种模式:简单模式、工作模式、发布/订阅模式、路由模式、主题模式、RPC模式简单模式:生产者直接发送消息到队列、消费者直接消费队列、不经过交换机工作模式:与简单模式一致,只是变成多个消费者消费同一......
  • [转]MQ详解以及各种消息中间件说明
    转自:https://blog.csdn.net/forebe/article/details/117993082 消息中间件相关知识1、概述消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间......
  • Go项目实战—RabbitMq篇
    技术栈gingormrabbitmq数据库表结构:CREATETABLE`article`(`id`intNOTNULLAUTO_INCREMENT,`article_name`varchar(64)COLLATEutf8mb4_unicode_ciNOTNULL,`content`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULL,`user_id`intNOTNULL,`......
  • Java版Flink使用指南——定制RabbitMQ数据源的序列化器
    大纲新建工程新增依赖数据对象序列化器接入数据源测试修改Slot个数打包、提交、运行工程代码在《Java版Flink使用指南——从RabbitMQ中队列中接入消息流》一文中,我们从RabbitMQ队列中读取了字符串型数据。如果我们希望读取的数据被自动化转换为一个对象,则需要定制序......
  • RocketMQ概念与模型
    为啥要用MQ?这个都应该会背了,6个字解耦、异步、削峰RocketMQ的优缺点?适用场景?主要与Kafka相比单机吞吐量:十万级(类似kafka)消息堆积:支持10亿级别消息堆积源码是Java天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其电商里订单扣款、业务削峰,业务场景在阿里双11经历过......
  • debian11 podman搭建rocketmq (初步测试)
    前言由于个人学习测试需要,想要在debian11环境下,使用podman搭建一个简单的单节点rocketmq,搭建过程比较繁琐,所以记录下来留作后续参考。由于对rocketmq镜像不熟悉,有些配置可能存在错误,会在后续有能力优化时继续更新此文档。后续可能会补充podman-compose实现方式,目前是shell脚本......
  • 数据结构——RMQ(ST表)问题
    数据结构——RMQ(ST表)问题问题描述对于序列\(A[1\dotsn]\),有\(m\)组询问\(\langlel,r\rangle\),求\(\max_{i=l}^rA_i\)。我们下面使用\(\mathcalO(A)\sim\mathcalO(B)\)表示预处理\(\mathcalO(A)\),单次询问\(\mathcalO(B)\)的时间复杂度。线段树解法时间复杂度......