Мне нужно запланировать периодическое задание для большого количества пользователей. Это задание будет выполняться с фиксированной скоростью, интервалом. Я хочу распределить выполнение задания для каждого пользователя равномерно по этому интервалу. Например, если интервал составляет 4 дня, я бы использовал последовательную функцию хеширования с идентификатором для каждого пользователя, чтобы планировать задание в одно и то же время, например. каждые 4 дня, на третий день.
Интервал относительно момента времени, который является одним и тем же для всех пользователей. Учитывая такой момент времени, например 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
относительно начала текущего интервала.
Здесь много математики, и я не уверен, что преобразование в миллисекунды везде будет поддерживать фактические даты. Есть ли более точный способ деления времени между двумя моментами и нахождение одного (подразделения), в котором мы находимся в настоящее время?