6 Matching Annotations
  1. Apr 2025
    1. 这是社区为了规避因多线程访问产生锁争用导致线程阻塞,从而引发请求超时问题而做的努力

      解决的问题

      当多线程同时执行该方法进行检查的时候,拿到锁的线程complete失败,而没拿到锁的线程直接跳过,那么如果没有其他线程再去处理的话,就永远也不会complete。

      如何解决?

      如果第一个线程成功将retry设置为false,那么第二个线程就会进行重试,而如果本身retry就是true,那么说明被其他线程先一步设置了,该线程不重试。但是如果多个线程顺序执行,都完成不了,那不是一样?

    2. bucket.flush(reinsert)

      相当于重新添加进时间轮,但是如果已经到了时间,那么就会执行。而且由于时间轮向后滚动,如果是最下面一级的bucket则所有元素都会过期,而上一级的bucket则会往下一级插入.

      由于DelayQueue的存在,时间复杂度和直接使用DelayQueue有什么不同?

      首先是以bucket为单位写入DelayQueue,bucket通过分层,使得每一层只有20个bucket,那么n层就只有n*20个bucket,大大减少了DelayQueue元素的数量,减小时间复杂度。

    1. 选择存活副本列表的第一个副本作为 Leader;选择存活副本列表作为 ISR

      NewPartition状态的分区,进行初始化(因为是初始化,所以数据都为空),会将存活副本设置为ISR,而将ISR第一个设置为Leader

    2. 实际上消息队列都是以分区为单位组织的。而一个topic拥有多个分区,客户端可以根据一定的规则(Partitioner)往这多个分区中写入数据,而消费者则通过一定规则或者随机分配到部分partition,从partition中顺序进行消费

    1. 源码会获取对应分区的详细数据,然后向该副本对象所在的 Broker 发送 LeaderAndIsrRequest 请求,令其同步获知,并保存该分区数据。

      为什么不是NewReplica状态就可以直接让其他broker同步?

      因为最前面判定了validReplicas,所以这些状态的变更都是允许的