4

文档说“每个轮子的默认刻度数(即轮子的大小)是 512。如果您要安排很多超时,您可以指定一个更大的值。”

这是否意味着默认情况下它只能处理 512 个超时?如果我想要 25 秒的 10 万次超时(对于SockJS),我应该将什么值设置为每个轮子的滴答数?

4

1 回答 1

9

轮子基本上是一个带有单独链接的哈希表,其哈希函数是“通知时间”。单独的链接被实现为无界有序集,因此轮子实际上可以容纳无限数量的超时。

如果您安排一个在遥远的将来超时的超时(即大延迟),大延迟将除以wheelSize * tickDuration,并将其余数用作超时的哈希值。因此,轮子中的​​当前槽可以同时保存将在下一个到期tickDuration的超时和将在(tickDuration * wheelSize * n)毫秒内到期的超时,其中变量n将随着计时器线程在轮子上迭代而减小。当计时器线程访问插槽时,后者将花费一些 CPU 时间,因为实际上并没有轮到它们过期。(这类似于传统哈希表中的冲突)。为了减少碰撞的机会,您可以增加车轮的尺寸。

例如,如果您确定大多数计划的超时将在一分钟内到期,您可以wheelSize * tickDuration设置一分钟(例如 600 个时隙 * 100 毫秒)。

有关散列轮的详细信息,请阅读

于 2013-01-10T05:43:23.160 回答