Мультитенентная архитектура pam, изоляция данных операторов на уровне row level security в postgresql и масштабирование базы данных

Современные B2B-платформы управления аккаунтами игроков (Player Account Management, PAM) обслуживают десятки независимых операторов (тенентов) в рамках единой пин ап уз облачной инфраструктуры. Проектирование мультитенентной базы данных требует строгого соблюдения двух противоположных требований: максимальной экономической эффективности за счет коллективного использования ресурсов (pool model) и абсолютной изоляции данных (data isolation). Утечка данных одного бренда в отчетность другого или случайный доступ игрока к балансу чужого оператора приводят к фатальным регуляторным штрафам и отзыву лицензии. Для гарантирования разделения данных без необходимости развертывания отдельных инстансов БД для каждого клиента архитекторы PAM используют механизм Row Level Security (RLS) в PostgreSQL.

Архитектура базы данных с RLS предполагает хранение информации всех операторов в общих таблицах (например, players, transactions, wallets), где каждая строка содержит обязательно индексируемую колонку tenant_id. Вместо написания ручных условий WHERE tenant_id = ... во всех прикладных SQL-запросах — что создает риск человеческой ошибки со стороны разработчиков — ограничения накладываются напрямую на уровне ядра PostgreSQL через политики безопасности (RLS Policies).

При установке соединения с базой данных пулом подключений (connection pool) микросервис выполняет сессионную установку контекста, передавая идентификатор текущего оператора через команду SET LOCAL app.current_tenant_id = 'tenant_123'. Сформулированное правило RLS автоматически перехватывает все операции SELECT, INSERT, UPDATE и DELETE, прозрачно добавляя фильтрацию по заданному контексту. Если компрометированный микросервис попытается запросить данные чужого оператора, СУБД вернет пустой результат или заблокирует транзакцию на уровне ядра.

Для обеспечения высокой производительности и масштабирования PostgreSQL-кластера с RLS применяется горизонтальное секционирование (declarative partitioning) по колонке tenant_id. Секционирование физически разделяет гигантские таблицы на отдельные сегменты на диске, позволяя планировщику запросов исключать нерелевантные секции (partition pruning) еще до выполнения поиска. В сочетании с использованием прокси-слоев для шардинга (таких как Citus) и пулированием соединений через PgBouncer, мультитенентная архитектура на базе PostgreSQL RLS обеспечивает линейное масштабирование базы данных до тысяч транзакций в секунду при сохранении гарантированной изоляции клиентов.