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

10.4 Broadcast — локальная рассылка

Broadcast<T> доставляет каждый опубликованный элемент всем текущим подписчикам.

oxl
let prices = Broadcast<Tick>(buffer: TICK_BUFFER, slow: .DropOldest, replay: 1)

scope {
  spawn { for await t in Exchange.feed() { prices.publish(t) } }
  spawn { for await t in prices.subscribe() { ui.render(t) } }
  spawn { for await t in prices.subscribe() { stats.add(t) } }
}

impl Market {
  rpc ticks() -> stream<Shared<Tick>, Lagged> => prices.subscribe()   // каждому клиенту
}
  • Подписчик получает элементы, опубликованные после подписки, в порядке публикации, плюс до replay последних элементов при подписке.
  • Элементы разделяются без копирования: подписчик получает Shared<T> (= Arc<frozen T>). По сети элемент кодируется один раз на все соединения.
  • Политика медленного подписчика slow:
ПолитикаПоведение
.Blockpublish ждёт, пока место освободится у самого медленного подписчика
.DropOldestу отставшего подписчика теряются старые элементы; количество потерь — sub.lagged()
.Disconnectстрим отставшего подписчика завершается ошибкой Lagged
  • prices.close() завершает все подписки. prices.subscribers() — число подписчиков.

См. также

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