10.4 Broadcast — локальная рассылка
Broadcast<T> доставляет каждый опубликованный элемент всем текущим подписчикам.
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:
| Политика | Поведение |
|---|---|
.Block | publish ждёт, пока место освободится у самого медленного подписчика |
.DropOldest | у отставшего подписчика теряются старые элементы; количество потерь — sub.lagged() |
.Disconnect | стрим отставшего подписчика завершается ошибкой Lagged |
prices.close()завершает все подписки.prices.subscribers()— число подписчиков.
См. также
Исходник: docs/spec/oxl-standard.md