文档说“每个轮子的默认刻度数(即轮子的大小)是 512。如果您要安排很多超时,您可以指定一个更大的值。”
这是否意味着默认情况下它只能处理 512 个超时?如果我想要 25 秒的 10 万次超时(对于SockJS),我应该将什么值设置为每个轮子的滴答数?
轮子基本上是一个带有单独链接的哈希表,其哈希函数是“通知时间”。单独的链接被实现为无界有序集,因此轮子实际上可以容纳无限数量的超时。
如果您安排一个在遥远的将来超时的超时(即大延迟),大延迟将除以wheelSize * tickDuration
,并将其余数用作超时的哈希值。因此,轮子中的当前槽可以同时保存将在下一个到期tickDuration
的超时和将在(tickDuration * wheelSize * n)
毫秒内到期的超时,其中变量n
将随着计时器线程在轮子上迭代而减小。当计时器线程访问插槽时,后者将花费一些 CPU 时间,因为实际上并没有轮到它们过期。(这类似于传统哈希表中的冲突)。为了减少碰撞的机会,您可以增加车轮的尺寸。
例如,如果您确定大多数计划的超时将在一分钟内到期,您可以wheelSize * tickDuration
设置一分钟(例如 600 个时隙 * 100 毫秒)。
有关散列轮的详细信息,请阅读此。