Можно ли настроить таймер, не использующий события — внутри актера Akka? (набранный Akka)

#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 ), и поскольку сообщение, отправленное таймером, не должно приводить к каким-либо событиям, это никак не влияет на модель событий.