Группы процессов
Группы процессов
Заголовок раздела «Группы процессов»Группы процессов позволяют процессам вступать в именованные группы и получать широковещательные сообщения, адресованные группе, с отслеживанием членства на каждой ноде кластера. Модель следует Erlang/OTP pg: группы создаются при первом вступлении, процесс может принадлежать многим группам (и вступать в одну группу несколько раз), и членство децентрализовано — каждая нода поддерживает собственное состояние и согласовывает его с пирами по internode-мешу.
Lua API задокументирован в Группах процессов; эта страница описывает тип записи scope и его конфигурацию. Окружающую модель membership см. в Руководстве по кластеру.
Тип записи
Заголовок раздела «Тип записи»| Тип | Описание |
|---|---|
pg.scope | Независимое пространство имён групп процессов с собственным состоянием членства и кластерным мешем |
Каждая область изолирована: группы и члены одной области невидимы в другой. Процесс открывает область по её entry ID (pg.open("app:pg")) и работает внутри неё.
- name: pg kind: pg.scope lifecycle: auto_start: trueКонфигурация
Заголовок раздела «Конфигурация»Все поля опциональны и имеют значения по умолчанию, настроенные для типичного кластера.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
protocol_timeout | duration | 5s | Таймаут для операций межнодовой синхронизации/обнаружения |
broadcast_timeout | duration | 5s | Таймаут доставки broadcast одному члену |
anti_entropy_interval | duration | 30s | Период цикла согласования; один пир синхронизируется за тик (0 отключает) |
circuit_breaker_failures | int | 3 | Последовательных ошибок отправки ноде до открытия автоматического выключателя |
circuit_breaker_reset_time | duration | 10s | Ожидание до перехода открытого автоматического выключателя в полуоткрытое состояние для тестовой отправки |
max_retries | int | 3 | Попыток повтора при неудачном broadcast (0 отключает повторы) |
retry_base_delay | duration | 100ms | Начальная задержка отступа между повторами |
retry_max_delay | duration | 1s | Максимальная задержка отступа |
action_queue_size | int | 256 | Глубина, при которой логируется предупреждение “approaching capacity” |
action_queue_max_size | int | 1024 | Жёсткая ёмкость внутренней очереди event loop; операции отбрасываются при заполнении |
monitor_buffer | int | 64 | Ёмкость канала событий на подписку; события отбрасываются для подписчика с заполненным буфером |
max_groups | int | 0 | Максимум различных групп (0 = без ограничений) |
max_members_per_group | int | 0 | Максимум членов на группу с учётом multi-join (0 = без ограничений) |
- name: pg kind: pg.scope anti_entropy_interval: 30s circuit_breaker_failures: 3 max_members_per_group: 10000 lifecycle: auto_start: trueКак это работает
Заголовок раздела «Как это работает»Состояние с единственным писателем. Каждая область запускает однопоточный event loop (паттерн gen_server). Все мутации сериализуются через него; чтения членов и групп обслуживаются из атомарно публикуемых снимков, поэтому они никогда не блокируют loop.
Распространение join/leave. Локальное join или leave применяется к loop и затем рассылается объединению живых пиров membership и ранее обнаруженных удалённых нод. Отправка в это объединение гарантирует, что свежеприсоединившаяся или ещё не сошедшаяся нода всё равно получит изменение.
Broadcast. broadcast делает снимок полного кросс-кластерного списка членов внутри loop, затем доставляет каждому члену вне loop, чтобы медленный получатель не мог заблокировать область. broadcast_local делает то же самое, но только для членов на локальной ноде.
Monitor и events. Подписка и получение снимка текущих членов происходят за один тик event loop, поэтому подписчик никогда не пропустит и не посчитает дважды изменение, гонящееся с подпиской. Подписчики получают события member.joined / member.left; leave для процесса, вступившего N раз, сообщает PID N раз, сохраняя кратность.
Anti-entropy и обнаружение. При запуске область отправляет сообщения обнаружения небольшому случайному подмножеству пиров (с ограничением, чтобы избежать N²-шторма при массовом перезапуске нод). При вступлении ноды она получает полную синхронизацию состояния. Цикл anti-entropy периодически отправляет полную синхронизацию одному пиру за раз, чтобы любой пропущенный broadcast в конечном счёте сошёлся. Получатель применяет дифференциальную синхронизацию — только фактически добавленные или удалённые члены генерируют события.
Автоматические выключатели. Per-node автоматический выключатель отслеживает последовательные ошибки отправки. После circuit_breaker_failures ошибок он открывается и отправки этой ноде пропускаются до истечения circuit_breaker_reset_time, когда разрешается одна тестовая отправка. Broadcast join/leave, попавшие на открытый выключатель, повторяются с экспоненциальным отступом до max_retries раз.
Наблюдаемость
Заголовок раздела «Наблюдаемость»Проверка готовности (pg.broadcast_recent.<scope>) сообщает о неработоспособности если область не видит broadcast-трафика длительное время, что сигнализирует о заблокированном event loop или устойчивом разделении. См. Руководство по наблюдаемости.
Смотрите также
Заголовок раздела «Смотрите также»- Группы процессов — Lua API
- Кластер — membership и модель кластеризации
- Модель процессов — процессы, PID и обмен сообщениями