#java #akka #scheduling #actor
#java #akka #планирование #актер
Вопрос:
Документация не слишком ясна в настройке таймера внутри актера. Это самая близкая информация по этому вопросу, которую я смог найти: Планирование сообщений для себя. Однако оттуда неясно, можем ли мы создать внутренний таймер внутри актера, который просто запускал бы какой-либо метод актера, например, каждые 5 секунд (например, проверяя состояние актера и реагируя на его изменение), без получения и отправки событий.
Если такой таймер можно настроить, насколько надежным он был бы? (например, если он может выйти из строя, в то время как актер продолжал бы функционировать в противном случае)
Также, если такой таймер можно настроить, должна быть возможность остановки и (повторного) запуска таймера с помощью метода triggered или метода другого актера?
Комментарии:
1. оформить заказ
Behaviors.withTimers
в документе doc.akka.io/docs/akka/current/typed /…
Ответ №1:
Если по
запускайте некоторый метод актера, например, каждые 5 секунд (например, проверяя состояние актера и реагируя на его изменение), без получения и отправки событий
вы имеете в виду «запланировать вызов метода внутри актера без отправки сообщения актеру», тогда ответ отрицательный.
Методы в актере должны выполняться только в прямой ответ на сообщение, отправленное актеру (или во время создания актера, но это, возможно, эффективно сообщение). Поступить иначе — значит отказаться (по крайней мере) от почти всех гарантий, которые может дать модель актера.
Комментарии:
1. У меня есть выбор: 1. запланировать актеров централизованно или 2. запланировать актеров изнутри самих себя. Я вижу, что централизованное планирование менее надежно, потому что в кластере Akka должен быть одноэлементный планировщик — это единственная точка отказа (даже при отказоустойчивости актора в кластере восстановление займет время), также трансляция из планировщика всем участникам в кластере добавит сложности и возможности того, что сообщение о планировании не дойдет до всех участников. Автономное планирование изнутри актера может быть более надежным с этой точки зрения.
2. Если мы используем внутренний планировщик / таймер в актере без того, чтобы каждый тик запускался сообщением от предыдущего тика (насколько я понимаю, именно так это работает при планировании сообщений для self — doc.akka.io/docs/akka/current/typed / … ), мы все еще можем правильно поддерживать модель событий для поиска событий, поскольку нам не нужны команды для восстановления состояния актера.
3. Я не уверен, какое отношение к этому имеет поиск событий: вы можете заставить планировщик отправлять сообщения без тиков, запускаемых сообщением с предыдущего тика (использовать
Timers.startTimerAtFixedRate
), и поскольку сообщение, отправленное таймером, не должно приводить к каким-либо событиям, это никак не влияет на модель событий.