doc表示“每个车轮的默认刻度数(即车轮的大小)为512.如果要计划大量超时,可以指定更大的值。”
默认情况下它是否只能处理512次超时?如果我想要10秒超时25秒(对于SockJS),我应该将每个车轮的刻度数设置为什么值?
答案 0 :(得分:9)
轮子基本上是一个带有单独链接的哈希表,其哈希函数是“通知时间”。单独的链接实现为无界有序集,因此轮子实际上可以保持无限次数的超时。
如果您计划在遥远的未来超时(即大延迟)的超时,则大延迟将除以wheelSize * tickDuration
,并使用其余数作为超时的哈希值。因此,方向盘中的当前插槽可以同时包含将在下一个tickDuration
内到期的超时以及将在(tickDuration * wheelSize * n)
毫秒内到期的超时,其中变量n
将减少为计时器线程遍历方向盘。当定时器线程访问插槽时,后者将花费一些CPU时间,因为它实际上并不是他们过期的。 (这类似于传统哈希表中的冲突)。为减少碰撞的几率,可以增加滚轮的尺寸。
例如,如果您确定预定的大部分超时时间都会在一分钟内到期,则可以每分钟wheelSize * tickDuration
次(例如600个插槽* 100毫秒)。
有关散列轮的详细信息,请阅读this。