本文是Kafka系列第4篇,从问题出发,从而探讨集群分区迁移实战、底层原理以及运维时需要考虑的问题。 掌握一到两门java主流中间件,是敲开BAT等大厂必备的技能,送给大家一个Java中间件学习路线,助力大家实现职场的蜕变。 Java进阶之梯,成长路线与学习资料,助力突破中间件领域 1、问题描述 某一天突然收到开发环境Kafka报 IO Exception(many open files),其相关的日志如下: 问题是发生在公司的开发环境,为了避免信息泄露,我在本地进行了模拟,不影响本次问题的分析与学习。 2、问题分…

2021年5月20日 0条评论 6点热度 阅读全文

副本管理器针对生产请求和l拉取请求都有一个全局的延迟缓存,生产请求对应延迟缓存中存储了延迟的生产(DelayedProduce),拉取请求对应延迟缓存中存储了延迟的拉取(DelayedFetch)。Kafka的延迟缓存数据结构(DelayedOperatlonPurgatory)和上一节的Purgatory类似。下面的代码片段以延迟的生产和拉取为例,列举了副本管理器中,与延迟缓存、延迟操作相关的方法: 延迟缓存除了管理延迟操作,还要从分区角度尝试完成延迟的操作,延迟缓存主要有下面两个方法。 tryCompleteE…

2021年4月23日 0条评论 15点热度 阅读全文

副本管理器针对生产请求和l拉取请求都有一个全局的延迟缓存,生产请求对应延迟缓存中存储了延迟的生产(DelayedProduce),拉取请求对应延迟缓存中存储了延迟的拉取(DelayedFetch)。Kafka的延迟缓存数据结构(DelayedOperatlonPurgatory)和上一节的Purgatory类似。下面的代码片段以延迟的生产和拉取为例,列举了副本管理器中,与延迟缓存、延迟操作相关的方法: 延迟缓存除了管理延迟操作,还要从分区角度尝试完成延迟的操作,延迟缓存主要有下面两个方法。 tryCompleteE…

2021年4月23日 0条评论 7点热度 阅读全文

6.3 延迟操作 Kafka的服务端处理客户端的请求,针对不同的请求,可能不会立即返回响应结果给客户端。比如,生产者设置的应答值等于-I,服务端必须等待ISR所有副本都同步完消息,才会发送生产结果给生产者。消费者或备份副本设置的最小拉取大小等于l字节,服务端必须至少读取到l字节的消息,才会发送拉取结果给消费者或备份副本。 Kafka在处理这种类型的请求时,会将“延迟返回响应结果的请求”即“延迟操作”对象(DelayedOperation)放入“延迟缓存队列”(DelayedOperationPurgatory)。延…

2021年4月23日 0条评论 13点热度 阅读全文

6.3 延迟操作 Kafka的服务端处理客户端的请求,针对不同的请求,可能不会立即返回响应结果给客户端。比如,生产者设置的应答值等于-I,服务端必须等待ISR所有副本都同步完消息,才会发送生产结果给生产者。消费者或备份副本设置的最小拉取大小等于l字节,服务端必须至少读取到l字节的消息,才会发送拉取结果给消费者或备份副本。 Kafka在处理这种类型的请求时,会将“延迟返回响应结果的请求”即“延迟操作”对象(DelayedOperation)放入“延迟缓存队列”(DelayedOperationPurgatory)。延…

2021年4月23日 0条评论 5点热度 阅读全文

5.4.7 延迟的心跳 延迟操作有3个主要的方法:尝试完成方法(返回布尔值,表示是有可以完成)、超时的回调方法、完成的回调方法。对于“延迟加入”,尝试完成是判断消费组成员中是否还有消费者没有重新发送“加入组请求”,如果全部都发送了“加入组请求”,就认为“延迟加入”可以完成。“延迟加入”完成时的回调方法会发送“加入组响应”。 “延迟心跳”的尝试完成方法(tryCompleteHeartbeat())判断条件是:消费者成员是否存活。如果消费者存活,则可以调用完成时的回调方法(onCompleteHeartbeat())…

2021年4月21日 0条评论 13点热度 阅读全文

5.3.2 延迟操作和延迟缓存 Kafka服务端在处理客户端的一些请求时,如果不能及时返回响应结果给客户端,会在服务端创建一个延迟操作对象(DelayedOperatlon),并放在延迟缓存中(DelayedOperati.onPurgatory)。Kafka的延迟操作有多种:延迟的生产、延迟的响应、延迟的加入、延迟的心跳。关于延迟操作和延迟缓存相关的流程,会在下一章详细分析,这里先给出一些延迟操作相关的结论。 延迟操作需要指定一个超时时间,表示在指定时间内没有完成时会被强制完成。 延迟操作加入到延迟缓存中,会指定…

2021年4月21日 0条评论 13点热度 阅读全文

5.3.3 尝试完成延迟的加入操作 协调者在创建完延迟操作对象之后,为了检查能否完成刚刚创建的延迟操作,会调用延迟缓存的tryCompleteElseWatch()方法立即尝试完成。延迟缓存会调用延迟操作的tryComplete()方法,对于加入组的延迟缓存,就是调用延迟加入对象的tryCompleteJoi.n()方法。这个方法的第二个参数表示如果可以完成,就会强制完成延迟加入对象,RP最终会调用到延迟加入对象的onCompleteJoi.n()方法。延迟加入操作对象的tryComplete()方法和onComp…

2021年4月21日 0条评论 58点热度 阅读全文

4.3.5 心跳和协调者的关系 客户端调用心跳任务的reset()方法会创建第一个延迟任务,这个方法的调用链如下。 确保协调者是已知的,即消费者客户端必须连接上管理消费组的协调者。 确保消费组是活动的,即消费者必须分配到分区。 注意:上面两个调用的方法都定义在对应的请求回调处理器中,前者是“获取消费组的协调者”请求(GroupCoordi.natorRequest),后者是“加入消费组”请求(Joi.叫roupRequest)。消费者和协调者进行交互操作,必须确保消费者已经知道并且连接上协调者所在的节点,如果都没有…

2021年4月20日 0条评论 16点热度 阅读全文

4.3.4 处理心跳结果的示例 如图4-34所示,客户端启动时会创建调度时间为0秒的延迟任务加入队列。客户端轮询的时间为2秒,会弹出延迟任务(因为延迟任务的调度时间小于当前时间),现在队列为空了。但是因为没有上一次心跳,只有上一次的会话重置时间,经过下面3个步骤的计算后,会重新创建一个调度时间为5秒的延迟任务加入队列。 (1)距离上次心跳的时间间隔=当前轮询的时间-上次会话的重置时间=2秒一0秒=2秒。 (2)距离下次心跳的时间间隔=心跳间隔距离上次心跳的时间间隔=5秒-2秒=3秒。 (3)下次心跳任务的时间=当前…

2021年4月19日 0条评论 16点热度 阅读全文