12.5 Шардированные акторы
@idle(ACCOUNT_IDLE)
actor Account sharded by id: AccountId {
var balance: Money = Money.zero()
@transient var hits: u64 = 0
on activate { log.debug("account {id} up") }
msg deposit(x: Money) { balance += x }
msg balance() -> Money { balance }
}
Account(id).deposit(amount)- Ключ объявляется в заголовке (
sharded by имя: Тип) и доступен в теле как неизменяемое поле. Account(key)—ActorRef<Account>; актор активируется при первом сообщении на узле-владельце шарда. В кластере одновременно активен не больше одного экземпляра на ключ.- Поля
varсохраняются в журнал после каждого сообщения до отправки ответа;@transient varне сохраняются. При активации состояние восстанавливается, иначе берутся значения по умолчанию; затем выполняетсяon activate. @idle(d)выгружает актор послеdбез сообщений (on passivateперед выгрузкой).- Семантика обработки сообщений — §8.8. При переезде шарда рантайм повторяет доставку; сообщения, меняющие состояние, СЛЕДУЕТ делать идемпотентными.
- В тестах
Account.local(key)создаёт экземпляр в процессе без кластера.
Определяется реализацией. Дедупликация сообщений актора (D-8055; DIV-018; D-4899). Стандарт требует at-least-once с дедупликацией, но не задаёт её границ. Эта реализация: окно дедупликации — 64 последних сообщения; метки не истекают по времени (
IDEMPOTENCY_TTLк сообщениям акторов не применяется); атрибута@mailbox(размер очереди) нет.
Связанные диагностики
См. также
Исходник: docs/spec/oxl-standard.md