Isolation Module¶
Изоляция обработки событий (аналог EventIsolation из aiogram).
Сериализует конкурентную обработку апдейтов одного пользователя,
чтобы FSM-переход, завершённый предыдущим апдейтом, был виден
следующему. Без изоляции при параллельной обработке
(Dispatcher(use_create_task=True) или вебхук) два быстрых
сообщения одного пользователя читают один и тот же снимок состояния
и одноразовый шаг FSM выполняется дважды.
IsolationKey = tuple[int | None, int | None]
module-attribute
¶
Ключ изоляции: (chat_id, user_id).
BaseEventIsolation
¶
Bases: ABC
Базовый класс изоляции обработки событий.
Реализация обязана вернуть асинхронный контекст-менеджер,
удерживающий блокировку по ключу (chat_id, user_id) на всё
время обработки события.
lock(key)
abstractmethod
¶
Возвращает контекст-менеджер блокировки по ключу.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
IsolationKey
|
Ключ изоляции |
required |
close()
abstractmethod
async
¶
Освобождает ресурсы изоляции.
Вызывается диспетчером при каждом stop_polling(),
поэтому реализация должна быть идемпотентной.
DisabledEventIsolation
¶
Bases: BaseEventIsolation
Отключённая изоляция (поведение по умолчанию).
События обрабатываются без сериализации — как до появления механизма изоляции.
lock(key)
async
¶
SimpleEventIsolation()
¶
Bases: BaseEventIsolation
Изоляция на asyncio.Lock в памяти процесса.
На каждый ключ (chat_id, user_id) создаётся отдельная
блокировка; события одного пользователя обрабатываются строго
последовательно (в порядке поступления — asyncio.Lock
пробуждает ожидающих в FIFO), события разных пользователей —
параллельно.
В отличие от aiogram, неиспользуемые блокировки удаляются из словаря, как только их никто не держит и не ожидает.
Подходит только для одного процесса. При нескольких процессах
(например, вебхук за балансировщиком) используйте
:class:RedisEventIsolation.
Source code in maxapi/context/isolation.py
lock(key)
async
¶
Удерживает блокировку по ключу на время контекста.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
IsolationKey
|
Ключ изоляции |
required |
Source code in maxapi/context/isolation.py
RedisEventIsolation(redis_client, key_prefix='maxapi', lock_timeout=DEFAULT_REDIS_LOCK_TIMEOUT, lock_sleep=DEFAULT_REDIS_LOCK_SLEEP)
¶
Bases: BaseEventIsolation
Распределённая изоляция на блокировках Redis.
Сериализует обработку событий одного пользователя между
несколькими процессами/инстансами бота. Парная к
:class:~maxapi.context.context.RedisContext — используйте их
вместе. Требует установленной библиотеки redis:
pip install redis.
Инициализация изоляции.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
redis_client
|
Any
|
Экземпляр |
required |
key_prefix
|
str
|
Префикс ключей блокировок. Рекомендуется тот
же, что у вашего |
'maxapi'
|
lock_timeout
|
float | None
|
Максимальное время удержания блокировки в секундах (страховка от вечного лока при падении процесса). Если обработка события длится дольше, блокировка истекает и изоляция для этого события перестаёт действовать. None — без ограничения; не рекомендуется: после падения процесса, державшего блокировку, ключ останется в Redis навсегда и все апдейты этого пользователя зависнут до ручного удаления ключа. |
DEFAULT_REDIS_LOCK_TIMEOUT
|
lock_sleep
|
float
|
Интервал опроса блокировки в секундах. |
DEFAULT_REDIS_LOCK_SLEEP
|
Source code in maxapi/context/isolation.py
lock(key)
async
¶
Удерживает распределённую блокировку по ключу.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
IsolationKey
|
Ключ изоляции |
required |