Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Путь

Путь строки через сервис: захват, доставка, декодирование, обработчик, ответ и завершение, по одной строке, пакетами или в виде самой строки.

Путь строки от захвата до завершения: по одной с ответом, пакетами и в режиме строкиПо однойПакетыРежим строкиЗахват: построке насвободноговоркераInboxDeliveryстрока, её id,попыткаКодек читаетполезнуюнагрузку, некопируя еёОбработчикОтвет: одинбуфер на все,вставляетRoutedИсходзавершаетстрокуЗахват доразмерапакетаПакетдоставок,один захватКаждаянагрузкадекодируетсяотдельноОбработчикпакетовСтрокизавершаются,при блокировкестрок разомЗахват: построке насвободноговоркераСтрока, какеё прочиталдрайверОбработчикберёт &RowИсходзавершаетстроку
Схема текстом
  1. По одной: Захват: по строке на свободного воркера; InboxDelivery строка, её id, попытка; Кодек читает полезную нагрузку, не копируя её; Обработчик; Ответ: один буфер на все, вставляет Routed; Исход завершает строку
  2. Пакеты: Захват до размера пакета; Пакет доставок, один захват; Каждая нагрузка декодируется отдельно; Обработчик пакетов; Строки завершаются, при блокировке строк разом
  3. Режим строки: Захват: по строке на свободного воркера; Строка, как её прочитал драйвер; Обработчик берёт &Row; Исход завершает строку
  4. Захват: по строке на свободного воркера → InboxDelivery строка, её id, попытка
  5. InboxDelivery строка, её id, попытка → Кодек читает полезную нагрузку, не копируя её
  6. Кодек читает полезную нагрузку, не копируя её → Обработчик
  7. Обработчик → Ответ: один буфер на все, вставляет Routed
  8. Ответ: один буфер на все, вставляет Routed → Исход завершает строку
  9. Захват до размера пакета → Пакет доставок, один захват
  10. Пакет доставок, один захват → Каждая нагрузка декодируется отдельно
  11. Каждая нагрузка декодируется отдельно → Обработчик пакетов
  12. Обработчик пакетов → Строки завершаются, при блокировке строк разом
  13. Захват: по строке на свободного воркера → Строка, как её прочитал драйвер
  14. Строка, как её прочитал драйвер → Обработчик берёт &Row: без кодека
  15. Обработчик берёт &Row → Исход завершает строку

Захват берёт строки в работу по форме захвата таблицы, и каждая строка становится доставкой InboxDelivery. Доставка содержит строку в том виде, в каком её декодировал драйвер, её id, номер попытки и то, что держит для неё форма: транзакцию, токен аренды или соединение ключа. В режиме полезной нагрузки кодек читает полезную нагрузку прямо из столбца строки: байты заимствуются, а не копируются. Заголовки строятся при первом чтении, поэтому обработчик, который их не читает, за них не платит. Строку, полезная нагрузка которой не декодируется, завершает политика декодирования подписки.

В режиме строки у таблицы нет столбца полезной нагрузки, и обработчик принимает саму строку, &Row, в том виде, в каком её прочитал драйвер. Кодек не работает, и ничего не копируется.

Пакет - это один захват: строки до размера пакета, доставленные вместе, и каждая декодируется отдельно. Строку, которая не декодируется, завершает политика декодирования, а остальные строки пакета остаются в нём. Каждая доставка пакета завершает свою строку. В форме блокировки строк строки пакета делят транзакцию захвата, поэтому их завершения вступают в силу вместе, когда заканчивается последнее, а оператор, вернувший ошибку, откатывает весь пакет. В формах аренды и рекомендательной блокировки каждая строка завершается сама по себе.

Ответ кодируется в буфер, который переиспользует цикл диспетчеризации, и издатели крейта принимают его как заимствованный срез. Routed, издатель ответов по умолчанию, ищет имя ответа среди маршрутов брокера и вставляет ответ через реализацию Publish строки. Перед вставкой он проверяет, что брокер не завершил работу и что таблица может вместить каждый заголовок сообщения. После вставки он объявляет о строке через pg_notify при listen_notify и будит подписки своей таблицы в процессе. Доставка завершается после ответа, как показывает страница Завершение.

Страница Бенчмарки публикует, во что обходится сообщение на каждом из этих путей, в инструкциях и выделениях памяти, рядом с сырым циклом sqlx, который выполняет те же операторы.