Как эффективно распределять нагрузку между большим количеством бирж, если сайту нужно получать цены каждые 10 секунд?

Как оптимизировать работу с сайтом, на котором запускается команда каждые 10 секунд для отправки 10 Job классов пакетом? Как решить проблему с выполнением запросов к API бирж и сохранением цен в БД при настройке supervisors с numprocs=12 на сервере? Требуется совет от опытных специалистов с подобными задачами.
  • 21 мая 2024 г. 5:10
Ответы на вопрос 4
Для эффективного распределения нагрузки между большим количеством бирж и оптимизации работы с сайтом, который нужно обновлять каждые 10 секунд, можно использовать следующие подходы:

1. Использование асинхронных запросов: вместо синхронных запросов к API бирж можно использовать асинхронные библиотеки, которые позволяют отправлять запросы параллельно и эффективно обрабатывать ответы.

2. Кэширование данных: чтобы уменьшить нагрузку на сервер и ускорить получение цен с бирж, можно кэшировать результаты предыдущих запросов и обновлять их только при необходимости.

3. Распределение задач на несколько процессов: можно использовать механизмы распределенных вычислений, такие как Celery, для запуска задач на нескольких процессах одновременно.

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

5. Мониторинг и оптимизация производительности: следует регулярно мониторить производительность сайта и API бирж, оптимизировать код и структуру данных для улучшения производительности.

Если у вас возникают проблемы с выполнением запросов к API бирж и сохранением цен в БД при настройке supervisors с numprocs=12 на сервере, рекомендуется обратиться к опытным специалистам или консультантам по оптимизации процессов работы с данными. Они смогут помочь найти оптимальное решение для вашей конкретной задачи и настроить систему так, чтобы она работала стабильно и эффективно.
выполняют запросы к API бирж и сохраняют полученные цены в БД
При такой формулировке дальше я исхожу из того, что а) API отдают данные в более-менее нужном формате, б) цен не больше 1000 (наверняка же про крипту какую-то речь) и в) вам цены нужно только сохранить (простой INSERT/UPDATE), ничего с ними больше не делая.

просто увеличение numprocs это не правильно т.к. будет нагрузка на сервер
Если ваш сервер перестаёт справляться, вы мастштабируетесь либо горизонтально, либо вертикально.
Перекладывание джейсонов (т.е. работа с API) - это очень простая в плане ресурсов операция и никакой особой нагрузки она не создаст, весь затык у вас будет (если будет) в сетевых задержках.

пакет ещё не завершился а следующий вызов команды происходит
Показывайте код. Если у вас обращение к API и обработка его ответа занимает больше 10 секунд - это совершенно не нормально.
Ну а проблему с наложением запусков друг на друга можно решать по-разному (и решение будет зависеть от конкретных условий задачи), начать стоит с добавления withoutOverlapping .
Задача общая, не привязанная к фреймворкам, для начала переходишь на очередь, далее разделяешь загрузку (потому что почти всегда IO Bound по сети) и обработку данных (а тут часто работа с базой, CPU Bound и прочее). Мониторишь состояние очереди, регулируешь кол-во воркеров, дебажишь на поиск узкие мест, оптимизируешь (например, у многих бирж есть websocket, часто менее затратно подписаться на изменение цены, чем долбить своими запросами.)
10секунд * сотни бирж - с этим справится любой асинхронный движок работы с http... если нет, меняй инструмент. 

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

У тебя должен быть четкий алгоритм получения следующей ссылки на загрузку, например сохраняй в базе время последнего запроса к бирже, и соответственно запрашивай N серверов, с наибольшим временем с последнего запроса со статусом - требуется загрузка,.. так же отслеживай зависшие биржи, те кто слишком давно не выдавал корректного ответа можно переводить в замедленный режим опросов (менять условие, например не чаще раз в час, пока состояние - 'не было ответа').

Очень мало какие биржи позволят делать часто запросы, обычно там лимиты. И если тебе нужно мало валютных пар, это подойдет, но для бОльшего количества валютных пар часто для каждой нужно делать отдельный запрос, и получается что для биржи ихз будет десятки-сотни, получается значительная задержка по сбору информации для каждой конкретной валюты. Для бирж, у которых есть потоковые протоколы (для криптовалютных обычно на websocket) советую для них реализовать загрузку на нем. Форматы там у каждой биржи свои но зато оперативность получения информации - максимальная. Не нужно тратить своих ресурсов на анализ данных, не нужно долбить биржу постоянными запросами, ты получаешь информацию в тот момент, как событие произошло на бирже. Только таким способом к примеру можно собирать стаканы лимитных ордеров со всей биржи (на топовых биржах это гигабайты json в сутки).
Похожие вопросы