Producer发送消息采用的是异步发送的方式,消息发送过程如下:
Producer发送消息之后,经过拦截器,序列化,事务判断;
流程执行后,消息内容放入容器中;
容器在指定时间内如果装满(size),会唤醒Sender线程;
容器如果在指定时间内没有装满,也会执行一次Sender线程唤醒;
唤醒Sender线程之后,把容器数据拉取到topic中;
絮叨一句:读这些中间件的源码,不仅能开阔思维,也会让自己意识到平时写的代码可能真的叫搬砖。
2、存储机制Kafka中消息是以topic进行标识分类,生产者面向topic生产消息,topic分区(partition)是物理上的存储,基于消息日志文件的方式。
每个partition对应于一个log文件,发送的消息不断追加到该log文件末端;
log文件中存储的就是producer生产的消息数据,采用分片和索引机制;
partition分为多个segment。每个segment对应两个(.index)和(.log)文件;
index文件类型存储的索引信息;
log文件存储消息的数据;
索引文件中的元数据指向对应数据文件中message的物理偏移地址;
消费者组中的每个消费者,都会实时记录消费的消息offset位置;
当然消息消费出错时,恢复是从上次的记录位置继续消费;
3、事务控制机制Kafka支持消息的事务控制
Producer事务
跨分区跨会话的事务原理,引入全局唯一的TransactionID,并将Producer获得的PID和TransactionID绑定。Producer重启后可以通过正在进行的TransactionID获得原来的PID。
Kafka基于TransactionCoordinator组件管理Transaction,Producer通过和TransactionCoordinator交互获得TransactionID对应的任务状态。TransactionCoordinator将事务状态写入Kafka的内部Topic,即使整个服务重启,进行中的事务状态可以得到恢复。
Consumer事务
Consumer消息消费,事务的保证强度很低,无法保证消息被精确消费,因为同一事务的消息可能会出现重启后已经被删除的情况。
四、源代码地址 GitHub·地址 https://github.com/cicadasmile/data-manage-parent GitEE·地址 https://gitee.com/cicadasmile/data-manage-parent推荐关联阅读:数据源管理系列
序号 标题01 数据源管理:主从库动态路由,AOP模式读写分离
02 数据源管理:基于JDBC模式,适配和管理动态数据源
03 数据源管理:动态权限校验,表结构和数据迁移流程
04 数据源管理:关系型分库分表,列式库分布式计算
05 数据源管理:PostGreSQL环境整合,JSON类型应用
06 数据源管理:基于DataX组件,同步数据和源码分析
07 数据源管理:OLAP查询引擎,ClickHouse集群化管理