You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Pika快慢命令分离 - 线程池借用机制详细设计
文档信息
目录
1. 核心概念
1.1 什么是线程池借用?
定义: 当一个线程池负载过高(队列接近满)而另一个线程池负载较低(队列较空)时,高负载线程池的任务可以临时"借用"低负载线程池的资源来执行。
目的:
约束:
1.2 什么是键亲和性?
定义: 相同key的所有操作必须由同一个线程池处理,以保证操作的顺序性。
为什么需要键亲和性?
2. 线程池借用机制
2.1 借用的触发条件
系统通过队列饱和度来判断是否需要借用:
2.2 借用的四种场景
场景1: 慢命令 → 借用快池
触发条件:
执行流程:
代码实现:
场景2: 快命令 → 借用慢池
触发条件:
执行流程:
场景3: 有key且key属于对方池(强制路由)
这种情况不算借用,而是强制的亲和性路由:
场景4: 无法借用(正常路由)
情况1: 两个池都繁忙或都空闲
情况2: 有key亲和性约束
2.3 借用阈值的动态调整
系统每处理100个命令会自动调整借用阈值:
调整逻辑图示:
3. 键亲和性路由机制
3.1 一致性哈希实现
为什么使用一致性哈希而不是简单取模?
3.2 哈希环的构建
哈希环结构示意图:
这意味着无论何时计算
"user:123"的哈希值,结果都是一样的。哈希环的不变性
哈希环在系统启动时建立,之后保持不变:
一旦哈希环建立好,每个虚拟节点的位置就固定下来了。
组合效应:为什么同一个key始终路由到同一个线程池
结合上述两个特性,每次路由key的过程是这样的:
因此:
图解说明
假设我们的哈希环如下(简化版):
虚拟节点分布:
当我们多次计算"user:123"的路由时:
第一次计算:
第二次计算:
第N次计算:
代码验证
可以通过下面的代码验证同一key的路由结果始终一致:
实际应用的例子
当系统处理关于"user:123"的命令时:
总结
同一个key在多次计算中始终路由到同一个线程池的原因是:
这三个因素结合保证了:无论何时计算,相同的key总会被路由到相同的线程池,即使系统重启也不会改变这一结果。
这种设计使得系统不需要保存任何"key → 线程池"的映射关系,每次都可以"即时计算",减少了存储开销和同步复杂性,同时保证了命令处理的顺序性。
Beta Was this translation helpful? Give feedback.
All reactions