Azure Service Fabric - задание с фиксированным временем

Я работаю над проектом Service Fabric, в котором мне нужно реализовать задание по расписанию, которое может выполняться в определенное время (скажем, каждые 16 или 24 часа).

Вот моя реализация службы актера с отслеживанием состояния

      [StatePersistence(StatePersistence.None)]
internal class Actor3 : Actor, IActor3, IRemindable
{
    public Actor3(ActorService actorService, ActorId actorId): base(actorService, actorId)
    {
    }

    public async Task RegisterReminder()
    {
        try
        {
            var previousRegistration = GetReminder("Reminder2");
            await UnregisterReminderAsync(previousRegistration);
        }
        catch (ReminderNotFoundException) { }
        var reminderRegistration = await RegisterReminderAsync("Reminder2", null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1));
    }

    public async Task ReceiveReminderAsync(string reminderName, byte[] state, TimeSpan dueTime, TimeSpan period)
    {
        var location = Directory.GetCurrentDirectory();
        var current = DateTime.Now;
        Thread.Sleep(15000);
        using (var writer = File.AppendText("actor.txt"))
        {
            await writer.WriteLineAsync("2 :: " + current.ToString() + " --> " + DateTime.Now.ToString());
    }
    }
}

В коде я зарегистрировал свою службу актеров, чтобы запускать выполнение через 1 минуту после регистрации, а затем выполнять каждую 1 минуту после этого.

Когда я просматриваю логи в "act.txt", я вижу следующее:

      2 :: 2021-10-11 17:31:15 --> 2021-10-11 17:31:30
2 :: 2021-10-11 17:32:30 --> 2021-10-11 17:32:45
2 :: 2021-10-11 17:33:45 --> 2021-10-11 17:34:00

Из приведенных выше журналов видно, что

  • Первое выполнение началось в 17:31:15 и завершилось в 17:31:30 (заняло 15 секунд)
  • Второе выполнение началось в 17:32:30 (через 1 минуту после времени окончания) и завершилось в 17:32:45. Из приведенного выше требования он должен был начаться в 17:32:15 (поскольку ожидаемая продолжительность составляет 1 минуту между двумя выполнениями, а не 1 минута + предыдущее время выполнения.

Кажется, мне трудно найти решение, в котором я могу заставить актера работать в определенное время. (т.е. каждый день в 16:00 или 12:00)

1 ответ

Подумайте о создании актера с напоминанием, которое срабатывает периодически, скажем, каждую минуту. (в зависимости от требуемой точности) Внутри его состояния определите «время выполнения», которое указывает, когда действие должно быть выполнено.

Сравните «время выполнения» с текущим временем, включая дельту. Если есть перекрытие, выполните задачу.

Внутри состояния сохраните отметку времени последнего выполнения, чтобы избежать дублирования выполнения.

Периодически проверяйте, нет ли пропущенных казней.

Таким образом, вы можете справиться с временными сбоями в кластере (перемещение службы, перезапуск, обновление и т. Д.)