OxL Справочник OxL
РусскийEnglish

12.5 Шардированные акторы

oxl
@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 (размер очереди) нет.

actor-not-hosted

См. также

Исходник: docs/spec/oxl-standard.md