Как реализовать партиционирование данных
Что проверяют
Понимаете ли вы, где на самом деле живёт партиционирование: в базе или в брокере, а не в нарезке слайса на куски. Следом обычно спрашивают, чем партиционирование отличается от шардирования и по какому ключу вы бы делили конкретную таблицу.
Как отвечать
Начните с определения: партиционирование это деление одной большой таблицы на части по ключу, при котором для приложения она остаётся одной таблицей. В PostgreSQL это декларативное партиционирование, три способа:
- RANGE: по диапазону, чаще всего по дате. Классика для логов, событий, заказов;
- LIST: по перечню значений, например по региону или типу клиента;
- HASH: по остатку от хэша ключа, когда нужен равномерный разброс без естественного диапазона.
Главный выигрыш даёт partition pruning: если в WHERE есть ключ партиционирования, планировщик читает только нужные секции. Второй выигрыш в обслуживании: старые данные удаляются через DETACH PARTITION и DROP TABLE за миллисекунды вместо многочасового DELETE с раздуванием таблицы.
Со стороны Go кода почти нет: запросы через pgx не меняются, но в них обязан попадать ключ. Отдельно нужна задача, которая заранее создаёт партиции на следующий период (фоновая горутина по тикеру, cron или расширение pg_partman), и DEFAULT-партиция на случай промаха.
Если данные уже не помещаются на один сервер, это шардирование: роутинг по ключу делает приложение или прокси, часто через консистентное хэширование, чтобы добавление узла не перетасовывало все ключи. Тот же принцип у Kafka: сообщения с одинаковым ключом попадают в одну партицию и сохраняют порядок.
Где спотыкаются
Показывают код, который режет массив на чанки, и называют это партиционированием. Интервьюер ждёт разговора о хранении и запросах, а не о цикле с шагом.
Выбирают ключ, которого нет в типичных запросах. Тогда pruning не срабатывает, и каждый запрос обходит все секции, что медленнее, чем одна таблица.
Забывают ограничения: в PostgreSQL первичный ключ и уникальные индексы партиционированной таблицы обязаны включать ключ партиционирования, так что глобальная уникальность по одному id без него не гарантируется.