canal 数据消费介绍(3)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 概述    要理解canal数据消费过程,必须要知道canal的server端是如何响应client端的请求的,还记得我们之前说过的么,canal的server其实分为对内(CanalServerWithEmbedded)和对外的(CanalServerWithNetty),由CanalServerWithNetty负责响应client端请求,而后由CanalServerWithEmbedded负责进行处理。

概述

    要理解canal数据消费过程,必须要知道canal的server端是如何响应client端的请求的,还记得我们之前说过的么,canal的server其实分为对内(CanalServerWithEmbedded)和对外的(CanalServerWithNetty),由CanalServerWithNetty负责响应client端请求,而后由CanalServerWithEmbedded负责进行处理。

    server支持的动作包括 subscription(订阅)、unsubscription(取消订阅)、get(获取)、clientAck(确认)、clientRollback(回滚)。

    CanalServerWithNetty其实底层依赖的是netty,刚好清明的时候把netty大概看了一遍,所以说很多东西都是凑巧,看了不知道以后什么时候会用上。

    ok,最后想说的就是,这篇文章其实就想说清楚一个过程,就是client的get/ack/rollback三个过程,讲清楚这三个我觉得就够了。


canal消费流程

img_e680be62c8fe1622844f65f876944b0d.png
canal消费流程

说明

    从上图可以看出canal的消费其实由client向nettyServer发起请求,然后转由EmbeddedServer进行处理。


CanalServerWithNetty介绍


nettyServer介绍

img_f820515843541bce1c72f4c0acf612d3.png
CanalServerWithNetty介绍

说明:

    从构造函数可以看出来,在CanalServerWithNetty内部其实放入了一个CanalServerWithEmbedded对象,记得这句话,CanalServerWithNetty内部通过CanalServerWithEmbedded去完整真正的任务处理。

    注意bootstrap最后绑定的sessionHandler函数,这是处理函数的核心。


SessionHandler介绍

img_0c100b9c94581eb2bcaf9da3b8108b0a.png
SessionHandler介绍

说明

    SessionHandler支持上图中支持的操作,咱们就关注下GET、CLIENTACK、CLIENTROLLBACK这几个动作。


GET介绍

    get过程中我们要记得数据是从eventStore里面获取的,eventStore的设计其实是一个环状设计,可以参考《canal 组件介绍》,在这个基础上就可以理解了get的过程。

    get的过程其实是一个过程,主要是从store获取数据,然后记录消费位移(也就是get位置)到zk节点,这个记录其实使用了zk的持久化递增节点,这样子能够确保我们每次ack的时候按照顺序进行get。

    记录到zk的position位置包括三个关键位移,包括start、ack、end,至于这几个有什么用,暂时我也不清楚,应该就是你获取的这批数据的开始位移(start)、结束位移(end)、确认位移(ack)。

    记录的位移的zk节点目录是 /otter/canal/destinations/xxxx/clientId/mark/00000000-00000011,其中xxxx是instance的名字代表同步的数据,clientId代表启动的client端。


img_7692bc4e301dc49e8510718b1c7d132c.png
RingBuffer的设计
img_4abf5390b5374ac4384efe46140911b4.png
get操作-1
img_d5b67e1d469e9f5123a3ed78ede8f75f.png
get操作-2
img_c2eff4824b6e0b0fe816c043eb796005.png
get操作-3
img_77bc6c823ed324fbd0c92cda35fa4c14.png
get-4


CLIENTACK介绍

    ack过程其实就是就是client端发送ack消息体到server,server根据ack消息体里面的batchId和clientId去找到get数据时候获取上次记录的位移,通过删除记录节点并记录到新的zk节点完成ack确认,其实我们理解为就是我们删除了待ack的数据代表就完成了ack。

    记录的位移的zk节点目录是 /otter/canal/destinations/xxxx/clientId/mark/00000000-00000011,其中xxxx是instance的名字代表同步的数据,clientId代表启动的client端,这个目录我们可以理解消费过程的记录。

    最后我们会用单个节点记录消费位移,位置/otter/canal/destinations/xxxx/clientId/cursor,这个我们可以理解为最终结果的位移。

img_6e713ed3fb872eafd20922d2e27ebbd4.png
clientAck-1


img_0d58b695017c1d21f18a0bbff60b641a.png
clientAck-2


CLIENTROLLBACK介绍

    clientRollback的过程其实就是移动位移的过程,也就是在环形数据的get位移恢复到rollback的位置,再次强调一下重点,说三遍。

    rollback其实就是一个移动下标的过程而已。

    rollback其实就是一个移动下标的过程而已。

    rollback其实就是一个移动下标的过程而已。

img_db7f95118a0c6daaf21746653e7ba8d5.png
clientRollback-1


img_0297d419bfc06b82d5ac7e4eb1f2135c.png
clientRollback-2


img_8bb22d461a5f5d3be00d4c7f59298b5b.png
clientRollback-3
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1天前
|
消息中间件 存储 JSON
RocketMQ 消费进度持久化
本文介绍了RocketMQ中消费进度的持久化机制,包括普通消息和延迟消息的消费偏移量是如何存储的。普通消息的消费进度存储于`consumerOffset.json`文件,格式为`{Topic}@{ConsumerGroup}`,而延迟消息则存储于`delayOffset.json`文件,以`{delayLevel:offset}`的形式记录。文章详细分析了相关文件内容及代码实现,并指出Broker分别以5秒和10秒的间隔进行持久化操作。
|
2月前
|
消息中间件 存储 缓存
面试题Kafka问题之Kafka的生产消费基本流程如何解决
面试题Kafka问题之Kafka的生产消费基本流程如何解决
36 1
|
2月前
|
消息中间件 存储 RocketMQ
MetaQ/RocketMQ 原理问题之MetaQ中Broker的数据同步方式的问题如何解决
MetaQ/RocketMQ 原理问题之MetaQ中Broker的数据同步方式的问题如何解决
|
4月前
|
消息中间件 缓存 负载均衡
【Kafka】Kafka 消息的消费模式
【4月更文挑战第5天】【Kafka】Kafka 消息的消费模式
|
4月前
|
消息中间件 负载均衡 Kafka
【Kafka】Kafka 新旧消费者的区别
【4月更文挑战第7天】【Kafka】Kafka 新旧消费者的区别
|
4月前
|
消息中间件 Kafka
kafka写入和消费流程
kafka写入和消费流程
149 0
|
4月前
|
消息中间件 Kafka
Kafka的基本生产消费演示
Kafka的基本生产消费演示
64 0
|
9月前
|
消息中间件 数据采集 NoSQL
Kafka 里面的信息是如何被消费的
Kafka 里面的信息是如何被消费的
53 0
|
消息中间件 数据采集 NoSQL
Kafka 里面的信息是如何被消费的?
Kafka 里面的信息是如何被消费的?
99 0
|
消息中间件 存储 缓存
Kafka消费者JoinGroupRequest流程解析
当我们启动消费者客户端的时候, 会向协调器 coordinator 发起一个 JoinGroup的请求,表示要加入消费组中。 这个发起请求的地方在 AbstractCoordinator#sendJoinGroupRequest
Kafka消费者JoinGroupRequest流程解析