Налоги и криптовалюта Стартапы и венчурный капитал

Как масштабировать очереди PostgreSQL до 100 тысяч событий в секунду: опыт и лучшие практики

Налоги и криптовалюта Стартапы и венчурный капитал
Lessons from scaling PostgreSQL queues to 100k events per second

Разбор ключевых методов и технических решений, позволивших масштабировать очереди в PostgreSQL до обработки 100 000 событий в секунду. В статье раскрывается роль индексирования, оптимизация запросов, борьба с раздуванием таблиц и важность настройки базы данных для высоких нагрузок.

В современном мире обработки больших данных и потоков событий надежные и высокопроизводительные очереди играют ключевую роль в построении масштабируемых систем. RudderStack, компания, специализирующаяся на управлении данными, успешно настроила очереди на базе PostgreSQL с пропускной способностью до 100 000 событий в секунду, отказавшись от привычных специализированных инструментов вроде Apache Kafka. Их опыт пролил свет на множество тонкостей и вызовов, связанных с масштабированием и оптимизацией реляционных баз данных под задачи больших потоков событий. Главная причина выбора PostgreSQL кроется в его гибкости, надежности транзакций и простоте отладки. Однако перемещение функционала потоковых очередей на реляционную базу данных потребовало глубокого понимания особенностей архитектуры и механизмов работы PostgreSQL.

В основе очередей RudderStack лежит подход, при котором данные распределены по нескольким наборам — dataset, каждый из которых содержит порядка 100 тысяч заданий. Для каждого набора используется по две ключевые таблицы: таблица заданий, хранящая основные данные и метаданные о событиях, и таблица статусов, отражающая историю изменений состояния каждого задания. Ключевой техникой повышения производительности стала грамотная организация индексирования. Первоначально таблицы имели только первичные ключи, что обеспечивало быстрый старт, но с ростом объема данных запросы на выборку заданий стали работать значительно медленнее. Для борьбы с этим были изучены характерные шаблоны запросов, опирающиеся на атрибуты, важные для каждого типа pipeline: источник данных, пункт назначения, клиентский workspace.

На основе анализа с помощью инструмента EXPLAIN ANALYZE были созданы сложные составные индексы, учитывающие часто используемые в WHERE и ORDER BY столбцы, например, index на комбинацию job_id, id, job_state в таблице статусов. Такой подход привел к существенному снижению времени отклика запросов и повышению общей пропускной способности системы. Одной из важных особенностей PostgreSQL является возможность «индексных» (index-only) сканирований, позволяющих извлекать данные исключительно из индексов без обращения к основной таблице, что особо выгодно при больших объемах операций чтения. Но добиться стабильных индексных сканирований сложно, так как они зависят от состояния visibility map — структуры, отслеживающей видимость строк. В условиях высоконагруженных таблиц с постоянным потоком вставок такое состояние быстро меняется, и для поддержания его актуальности требуется регулярное выполнение VACUUM.

Это яркий пример того, как внутренние механизмы базы данных прямо влияют на производительность. Еще одна техническая сложность, с которой столкнулись инженеры RudderStack, — отсутствие в PostgreSQL поддержки так называемых «loose index scans» (сканирование с пропуском повторяющихся ключей), которые могли бы значительно оптимизировать выборку уникальных значений в огромных индексах. Решением стала реализация рекурсивных Common Table Expressions (CTEs), позволяющих эффективно итерировать уникальные ключи без необходимости обходить все совпадающие значения. Такая техника значительно ускоряет выборку активных pipeline, что критично для своевременного запуска рабочих процессов обработки задач. Система также нуждалась в тщательном контроле размера таблиц и объема хранимых данных.

Особая проблема возникала из-за огромного количества записей в таблице статусов, отражающих пути повторных попыток исполнения заданий. В случае массовых сбоев и повторных ретраев количество записей стремительно росло, вызывая так называемый table bloat — раздувание таблиц и замедление запросов. Для предотвращения этого была предложена стратегия регулярной компактации данных, при которой удаляются все старые записи о статусах для каждого задания, оставляя лишь самое актуальное состояние. Не менее важным этапом после удаления становится VACUUM ANALYZE — задача, освобождающая дисковое пространство и обновляющая статистику, необходимую оптимизатору запросов для адекватного планирования. Для быстрой загрузки больших объемов данных вместо множества отдельных INSERT используется команда COPY, предоставляющая прямой поток данных в таблицу с меньшими накладными расходами.

Это существенно повышает скорость записи и снижает нагрузку на систему. Процесс компактации прошел дальнейшую эволюцию от простой операции при достижении определенного процента завершенных заданий до более избирательного управления, основанного на статусе активных наборов данных. Быстрая очистка полностью обработанных наборов реализуется через прямое удаление, что минимизирует время простоя очередей. Компактация же активных наборах проводится только при условии эффективного сокращения числа таких наборов, тем самым избегая чрезмерных ресурсов для незначительного эффекта. Со временем количество наборов данных становится очень большим, что сказывается на скорости поиска конкретных заданий.

Чтобы избежать вынужденного обхода пустых наборов для каждого pipeline, внедряются многоуровневые кеши. Примером является «No Jobs Cache», который на уровне приложения хранит информацию о комбинациях pipeline и набора, где нет активных заданий, позволяя быстро пропускать бессмысленные запросы. Аналогично кеширование активных pipeline оптимизирует выборку списка рабочих контекстов при запуске воркеров. Интересным техническим открытием стало наблюдение, что в языке Go при передачи байтовых срезов драйвер PostgreSQL преобразует их в строковое hex-представление, что удваивает объем пересылаемых данных по сети. В то время как передача строковых значений происходит с минимальными накладными расходами.

Это подсказывает, что использование строк в Go для представления данных может значительно сэкономить трафик и уменьшить нагрузку на CPU, особенно при высоких объемах событий. Еще один вызов связан с так называемым write amplification — явлением, когда объем фактических физических записей на диск в PostgreSQL примерно в три раза превышает размер логических данных, подаваемых приложением. Это связано с архитектурой WAL, механикой хранения страниц и индексами. Учет этого параметра необходим при планировании пропускной способности дисковой подсистемы, чтобы избежать узких мест. Память играет критическую роль в обеспечении высокой производительности.

При полном размещении активной части данных и индексов в shared buffers запросы выполняются максимально быстро. Однако с ростом объемов неизбежен переход в режим обращений к диску, что резко снижает скорость. Для борьбы с этим необходимы не только эффективные стратегии кеширования и компактации, но и тщательная настройка параметров базы. Ключевые настройки PostgreSQL были адаптированы под нужды очередей с интенсивным записью и чтением. Увеличенный max_wal_size и wal_buffers позволили уменьшить частоту контрольных точек (checkpoints), сглаживая нагрузку на ввод-вывод.

Настройка work_mem и hash_mem_multiplier обеспечила баланс между оперативной памятью для операций сортировки и хеширования. Параметры эффективного кэширования (effective_cache_size) и сниженный random_page_cost стимулировали планировщик запросов отдавать предпочтение сканированию индексов, что ускоряло выборки. Автоматическая вакуумизация была усилена за счет более частых запусков и снижения задержек, что поддерживает хорошее состояние таблиц и индексов без вмешательства администратора. Отключение предупреждений о событиях checkptoint уменьшает шум в логах при интенсивных операциях. Опыт RudderStack показывает, что использование PostgreSQL в роли высокопроизводительной очереди — непростая, но достижимая задача.

Процесс требует внимательного анализа, настройки и постоянного мониторинга. По мере изменения рабочих нагрузок и роста данных возникают новые точки для оптимизации, а приобретенные знания становятся базой для управления настоящими промышленными системами обработки событий. Таким образом, PostgreSQL демонстрирует себя не только как надежная транзакционная СУБД, но и как гибкий инструмент для масштабируемой очередной системы, способной выдерживать сотни тысяч операций в секунду. Постоянное совершенствование архитектуры, грамотное индексирование, поддержание в актуальном состоянии статистики и умное кеширование — составляющие успеха масштабирования очередей на базе реляционной СУБД.

Автоматическая торговля на криптовалютных биржах Покупайте и продавайте криптовалюты по лучшим курсам Privatejetfinder.com (RU)

Далее
3 Top Money Tips From Jeff Bezos That Can Save Retirees From Financial Disaster
Воскресенье, 26 Октябрь 2025 Финансовая мудрость Джеффа Безоса: Три совета, которые помогут пенсионерам избежать денежных проблем

Известный предприниматель и миллиардер Джефф Безос делится ключевыми финансовыми принципами, которые помогут пенсионерам грамотно управлять своими средствами и избежать финансовых катастроф в период выхода на пенсию.

Crude Futures Hold Ground in Sideways Trade
Воскресенье, 26 Октябрь 2025 Нефтяные фьючерсы сохраняют позиции в боковом движении рынка

Анализ текущей ситуации на рынке нефтяных фьючерсов с акцентом на боковую динамику и факторы, влияющие на цены в условиях неопределенности мирового спроса и предложения.

U.S.-Based Wells Fargo Banker Blocked From Leaving China
Воскресенье, 26 Октябрь 2025 Американский банкир Wells Fargo задержан в Китае: что известно о ситуации

Подробный обзор инцидента с американским банкиром Wells Fargo, которому запретили покидать Китай. Анализ причин, возможных последствий и текущего состояния дипломатических отношений между США и Китаем.

Best savings interest rates today, July 17, 2025 (top account pays 4.3% APY)
Воскресенье, 26 Октябрь 2025 Лучшие процентные ставки по сберегательным счетам на 17 июля 2025 года: где получить максимальный доход в 4,3% годовых

Обзор актуальных процентных ставок по сберегательным счетам на середину июля 2025 года, анализ банковских предложений с высокими доходами и рекомендации по выбору наиболее выгодного варианта для накоплений.

U.S. Natural Gas Gains Ahead of Inventory Data
Воскресенье, 26 Октябрь 2025 Рост цен на природный газ в США на фоне ожиданий данных по запасам

Влияние ожиданий данных по запасам природного газа на рынок США и факторы, способствующие росту цен, а также анализ перспектив развития отрасли в контексте текущей рыночной конъюнктуры.

Meta Directors, Shareholders Settle Privacy Suit Before Board Members Testify at Trial
Воскресенье, 26 Октябрь 2025 Руководство и акционеры Meta урегулировали иск о нарушении конфиденциальности до начала судебных слушаний

Руководство и акционеры Meta достигли соглашения по делу о нарушении конфиденциальности, что позволило избежать судебных слушаний с участием членов совета директоров. Разрешение конфликта оказывает значительное влияние на репутацию компании и подчеркивает важность защиты данных пользователей в современном цифровом мире.

GE Aerospace Raises Guidance on Tariff-Resilient Engine Demand
Воскресенье, 26 Октябрь 2025 GE Aerospace увеличивает прогнозы по спросу на двигатели, устойчивые к тарифам

GE Aerospace пересматривает свои прогнозы в связи с растущим спросом на двигатели, устойчивые к тарифам, что отражает изменения в мировой авиационной и промышленных рынках. Рост заказов подчеркивает адаптацию компании к новым экономическим реалиям и воздействию международных торговых ограничений.