Spec-Zone.ru › Pony

Пакет Backpressure

Пакет Backpressure позволяет программистам Pony участвовать в системе обратной загрузки Pony runtime. Цель системы обратной загрузки — предотвратить неограниченный рост почтового ящика актора.

В общем случае система обратной загрузки runtime работает, регулируя планирование акторов. Когда актер перегружен, Pony runtime понижает приоритет планирования акторов, которые ему отправляют сообщения. Это изменение планирования позволяет перегруженному актору наверстать упущенное.

Pony runtime может обнаружить перегрузку на основе размера очереди сообщений. Однако перегрузку некоторых типов акторов обнаружить сложнее. Рассмотрим случай акторов, таких как TCPConnection.

TCPConnection управляет сокетом для отправки и получения данных от другого процесса. TCP-соединения могут испытывать обратную загрузку извне нашей программы Pony, которая препятствует их отправке. Pony runtime не может этого обнаружить, поэтому требуется вмешательство программиста.

TCPConnection — это лишь один пример. Этот пакет Backpressure существует для того, чтобы позволить программисту указать runtime, что данный актер испытывает нагрузку, и отправку сообщений следует соответствующим образом скорректировать.

Любой актер, которому необходимо сообщить runtime о необходимости «замедлить отправку сообщений» из-за внешних условий, может сделать это с помощью этого пакета. Кроме того, актеры, которые поддерживают свои собственные внутренние очереди любого типа, например, для буферизации, также являются идеальными кандидатами для использования этого пакета. Если внутренняя очередь актора становится слишком большой, он может вызвать Backpressure.apply, чтобы проинформировать runtime о перегрузке.

Пример программы

// Here we have a TCPConnectionNotify that upon construction
// is given a BackpressureAuth token. This allows the notifier
// to inform the Pony runtime when to apply and release backpressure
// as the connection experiences it.
// Note the calls to
//
// Backpressure.apply(_auth)
// Backpressure.release(_auth)
//
// that apply and release backpressure as needed

use "backpressure"
use "collections"
use "net"

class SlowDown is TCPConnectionNotify
  let _auth: BackpressureAuth
  let _out: StdStream

  new iso create(auth: BackpressureAuth, out: StdStream) =>
    _auth = auth
    _out = out

  fun ref throttled(connection: TCPConnection ref) =>
    _out.print("Experiencing backpressure!")
    Backpressure.apply(_auth)

  fun ref unthrottled(connection: TCPConnection ref) =>
    _out.print("Releasing backpressure!")
    Backpressure.release(_auth)

  fun ref connect_failed(conn: TCPConnection ref) =>
    None

actor Main
  new create(env: Env) =>
    try
      let auth = env.root as AmbientAuth
      let socket = TCPConnection(auth, recover SlowDown(auth, env.out) end,
        "", "7669")
    end

Примечание

Система обратной загрузки runtime — мощный инструмент. Вмешиваясь в её работу, программисты могут создать тупиковые ситуации. Любой вызов Backpressure.apply должен быть согласован с соответствующим вызовом Backpressure.release. Для применения или снятия обратной загрузки требуется авторизация с помощью возможности ApplyReleaseBackpressureAuth. Требование токена для применения или снятия обратной загрузки гарантирует, что код сторонних библиотек не сможет произвольно вмешиваться в работу runtime.

Открытые типы

  • тип BackpressureAuth
  • примитив Backpressure
  • примитив ApplyReleaseBackpressureAuth

© 2016-2020, The Pony Developers
© 2014-2015, Causality Ltd.
Licensed under the BSD 2-Clause License.
https://stdlib.ponylang.io/backpressure--index

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API