Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Путь
Путь строки через сервис: захват, доставка, декодирование, обработчик, ответ и завершение, по одной строке, пакетами или в виде самой строки.
Схема текстом
- По одной: Захват: по строке на свободного воркера; InboxDelivery строка, её id, попытка; Кодек читает полезную нагрузку, не копируя её; Обработчик; Ответ: один буфер на все, вставляет Routed; Исход завершает строку
- Пакеты: Захват до размера пакета; Пакет доставок, один захват; Каждая нагрузка декодируется отдельно; Обработчик пакетов; Строки завершаются, при блокировке строк разом
- Режим строки: Захват: по строке на свободного воркера; Строка, как её прочитал драйвер; Обработчик берёт &Row; Исход завершает строку
- Захват: по строке на свободного воркера → InboxDelivery строка, её id, попытка
- InboxDelivery строка, её id, попытка → Кодек читает полезную нагрузку, не копируя её
- Кодек читает полезную нагрузку, не копируя её → Обработчик
- Обработчик → Ответ: один буфер на все, вставляет Routed
- Ответ: один буфер на все, вставляет Routed → Исход завершает строку
- Захват до размера пакета → Пакет доставок, один захват
- Пакет доставок, один захват → Каждая нагрузка декодируется отдельно
- Каждая нагрузка декодируется отдельно → Обработчик пакетов
- Обработчик пакетов → Строки завершаются, при блокировке строк разом
- Захват: по строке на свободного воркера → Строка, как её прочитал драйвер
- Строка, как её прочитал драйвер → Обработчик берёт &Row: без кодека
- Обработчик берёт &Row → Исход завершает строку
Захват берёт строки в работу по форме захвата таблицы, и каждая строка
становится доставкой InboxDelivery. Доставка содержит
строку в том виде, в каком её декодировал драйвер, её id, номер попытки и то, что держит для неё
форма: транзакцию, токен аренды или соединение ключа. В режиме полезной нагрузки кодек читает
полезную нагрузку прямо из столбца строки: байты заимствуются, а не копируются. Заголовки
строятся при первом чтении, поэтому обработчик, который их не читает, за них не платит. Строку,
полезная нагрузка которой не декодируется, завершает политика декодирования подписки.
В режиме строки у таблицы нет столбца полезной нагрузки, и обработчик принимает саму строку,
&Row, в том виде, в каком её прочитал драйвер. Кодек не работает, и ничего не копируется.
Пакет - это один захват: строки до размера пакета, доставленные вместе, и каждая декодируется отдельно. Строку, которая не декодируется, завершает политика декодирования, а остальные строки пакета остаются в нём. Каждая доставка пакета завершает свою строку. В форме блокировки строк строки пакета делят транзакцию захвата, поэтому их завершения вступают в силу вместе, когда заканчивается последнее, а оператор, вернувший ошибку, откатывает весь пакет. В формах аренды и рекомендательной блокировки каждая строка завершается сама по себе.
Ответ кодируется в буфер, который переиспользует цикл диспетчеризации, и издатели крейта
принимают его как заимствованный срез. Routed, издатель ответов
по умолчанию, ищет имя ответа среди маршрутов брокера и вставляет ответ через реализацию
Publish строки. Перед вставкой он проверяет, что брокер не
завершил работу и что таблица может вместить каждый заголовок сообщения. После вставки он
объявляет о строке через pg_notify при listen_notify и будит подписки своей таблицы в
процессе. Доставка завершается после ответа, как показывает страница Завершение.
Страница Бенчмарки публикует, во что обходится сообщение на каждом из этих путей, в инструкциях и выделениях памяти, рядом с сырым циклом sqlx, который выполняет те же операторы.