【发布时间】:2015-10-27 15:06:23
【问题描述】:
我需要为大量用户安排定期作业。此作业将以固定速率运行,即间隔。我想在该时间间隔内均匀地分配每个用户的作业执行。例如,如果间隔是 4 天,我会使用 consistent hashing function 和每个用户的标识符来同时安排作业,例如。每 4 天,第 3 天。
间隔是相对于所有用户都相同的原始时刻。给定这样一个起始时刻,如Instant#EPOCH 或其他一些常数值,我如何找到当前间隔的开始日期?
我可以的
Instant now = Instant.now();
Instant origin = Instant.EPOCH;
Duration interval = Duration.ofDays(4);
Duration duration = Duration.between(origin, now);
long sinceOrigin = duration.toMillis();
long millisPerInterval = interval.toMillis();
long intervalsSince = sinceOrigin / millisPerInterval;
Instant startNext = origin.plus(interval.multipliedBy(intervalsSince));
int cursor = distributionStrategy.distribute(hashCode, millisPerInterval);
然后我可以使用cursor 将作业安排在相对于当前间隔开始的Instant。
这里有很多数学问题,我不确定在任何地方都转换为毫秒是否会支持实际日期。有没有更精确的方法来划分两个瞬间之间的时间并找到我们当前所处的那个(细分)?
【问题讨论】:
-
我对这个问题有点困惑。间隔内的工作分配实际上与问题无关,对吗?您只是在问如何找到正确的下一个间隔的确切开始时刻?
-
@Zwander 没错。一旦我有了起点,我就可以应用分布。我只是想表明我的最终目标。
-
在您的示例中,间隔是 4 个逻辑天还是 345,600 秒?换句话说,是
Period还是Duration? -
@namshub 理想情况下两者都是,但假设是持续时间。
-
@Pillar
Period和Duration代表不同的概念。如果您的语言环境采用夏令时,则四天可能少至 342,000 秒或多至 349,200 秒。