06 2020 档案
AQS 中的条件
摘要:按照我看源码的进度,条件 condition 是 aqs 的最后一块拼图。 我总结的 aqs 三要素:stateownerThread等待队列 这里没有考虑到 condition,condition 的用法如下 lock.lock(); condition.await(t); lock.unlock
阅读全文
ScheduledThreadPoolExecutor 需要注意的点
摘要:这是定时任务的线程池,用户通过 schedule,scheduleAtFixedRate,scheduleWithFixedDelay 把定时任务加入到堆队列中,工作线程取出队列头元素,当任务执行完成后,重新设置任务的执行时间,放回到队列中。 使用过程中,有几点需要注意: 1. scheduleAt
阅读全文
kafka controller 处理事件
摘要:KafkaController 需要处理各种各样的事件,事件统一投递到队列里面,由一个线程进行消费。 // kafka.controller.ControllerEventManager private val putLock = new ReentrantLock() // 存放事件的队列 pri
阅读全文
切换 leader
摘要:场景: 3 节点集群 (b1, b2, b3),分区 tp1 的 isr[1, 2, 3],leader 是 1,现在希望把 tp1 的 leader 切换为 3,怎么操作? 1. 通过 zk 客户端,修改 zk 上 tp1 的 isr 列表为 [3, 2, 1] 2. 执行命令行 kafka-pr
阅读全文
副本迁移
摘要:kafka 非常难,难在 broker 有角色之分,controller 起控制作用,难在副本有角色之分,leader 提供读写服务,所以 broker 会有状态的切换,副本也有状态的切换。 从一个具体的场景切入,4 节点集群(b1, b2, b3, b4),存在 1 个分区 tp0 分布在 (b1
阅读全文
ReentrantLock.tryLock
摘要:通常使用 ReentrantLock.tryLock 的时候,都会带上一个时间戳,如果到了时间仍然没获取锁返回 false。 不带时间戳,当前线程只会尝试获取一次锁,然后返回结果;带上时间戳,则当前线程在等待时间内会多次尝试获取锁。 这里面细节还挺多,在等待时间内,线程是否会挂起? 如果挂起,是怎么
阅读全文
isr 管理
摘要:每一个副本 leader 管理自己的 isr 列表,进行扩缩,并写入 zk 把某些 replica 加入到 isr 中:如果 follower 的 offset 大于等于 leader 的 HW,则把该 replica 加入到 isr 中 // kafka.cluster.Partition#may
阅读全文
kafka 的 DelayedProduce
摘要:producer 发送数据到 broker,如果 producer 端设置 acks = -1,同时 broker 侧配置 min.insync.replicas = 2,这时 broker 会创建 DelayedProduce,leader broker 会等待消息复制到其他副本中,或者超时后返回
阅读全文