Группы сообщений
Входящие сообщения собираются в группы, чтобы исполнять их детерминированно и максимально эффективно использовать вычислительные ресурсы серверов.
Буфер сообщений
Буфер сообщений это служебный компонент, который собирает и группирует сообщения из разных очередей, чтобы детерминированно и эффективно подготавливать вход для набора группы.
- В буфер попадают внутренние сообщения из диапазонов очереди.
- В буфер попадают внешние сообщения из якорей DAG-мемпула.
- В буфер попадают новые внутренние сообщения, которые появились после исполнения предыдущих групп в текущем блоке.
Буфер хранит сообщения по аккаунтам получателей и поддерживает служебные счетчики внутренних и внешних сообщений. Дополнительно хранится служебный индекс, который ускоряет обход аккаунтов при наборе группы, и минимальное время цепочки среди внешних сообщений.
Параметры буфера задаются в on-chain параметре 28 через настройки исполнения сообщений.
- Ограничение общего количества сообщений в буфере.
- Ограничение числа одновременно открытых диапазонов чтения.
- Окно актуальности внешних сообщений.
Группа сообщений
Группа сообщений это набор сообщений, который передается в стадию исполнения. Все сообщения из этого набора выполняются в рамках одного шага.
Размер группы и правила отбора сообщений задаются on-chain в параметре 28 конфигурации коллации. В этом параметре задаются лимит слотов группы, глубина слота и окно актуальности внешних сообщений.
Просроченные внешние сообщения отбрасываются и не добавляются в группу для исполнения. Порог просрочки считается от текущего времени цепочки и тайм-аута жизни внешнего сообщения.
Итоговая группа передается исполнителю и исполняется полностью как один шаг.
После исполнения применяются результаты транзакций, а новые внутренние сообщения возвращаются в общий цикл чтения и следующего набора групп.
Партиции
Партиции нужны, чтобы перегруженные аккаунты не ухудшали заполняемость групп и не замедляли обработку остальных аккаунтов.
В Tycho используется две партиции очереди сообщений: основная и низкоприоритетная.
По умолчанию аккаунт обрабатывается в основной партиции. Если накопленная очередь сообщений аккаунта основной партиции превышает лимит, маршрутизация переносит такой аккаунт в низкоприоритетную партицию.
Группы сначала собираются отдельно по каждой партиции, а затем объединяются в одну итоговую группу.
Низкоприоритетной партиции выделяется отдельная доля слотов из on-chain настроек исполнения сообщений.
Если в конфигурации для низкоприоритетной партиции выделены слоты, этот объем резервируется при наборе группы и гарантированно доступен этой партиции.
Если одна из партиций недогружена, свободная емкость группы используется активной партицией, чтобы сохранять максимальный полезный объем исполнения.