哈希时间轮

哈希时间轮

Kafka 使用的是一种改进的时间轮算法,称为哈希时间轮(Hashed Wheel Timer)。


核心改进

支持任意延时

class HashedTimingWheel:
    """哈希时间轮"""
    
    def __init__(self, tick_interval=10, wheel_size=512):
        self.tick_interval = tick_interval  # 10ms
        self.wheel_size = wheel_size        # 512 个槽
        self.wheel = [[] for _ in range(wheel_size)]
        self.current_tick = 0
    
    def add_task(self, task, delay_ms):
        """添加任务"""
        # ✅ 计算剩余 tick 数
        ticks = delay_ms // self.tick_interval
        
        if ticks < self.wheel_size:
            # ✅ 短延时:放入当前时间轮
            slot = (self.current_tick + ticks) % self.wheel_size
            self.wheel[slot].append(task)
        else:
            # ✅ 长延时:降级处理(如放入数据库)
            self._handle_long_delay(task, delay_ms)
    
    def tick(self):
        """时间轮转动"""
        # 获取当前槽位的任务
        tasks = self.wheel[self.current_tick]
        
        # 清空槽位
        self.wheel[self.current_tick] = []
        
        # 移动到下一个槽位
        self.current_tick = (self.current_tick + 1) % self.wheel_size
        
        return tasks

优势

  1. ✅ 支持短延时的高性能处理
  2. ✅ 内存占用固定
  3. ✅ 实现相对简单