У меня есть несколько работников Python, которые сканируют определенные веб-сайты, анализируют данные и сохраняют их в базе данных Postgres.
Мне неясно, как сконструировать код для оптимизации ресурсов сервера (развернутых на микросервисах несколькими модулями).на Кубернетес).Предположим, что для запроса нет ограничения по скорости.
В демонстрационных целях я создал пример кода, который получает лучшие 10 000 веб-сайтов, сохраняет их на БД, а затем сканирует результаты поиска из Bing (и сохраняет их).также).Это может быть расширено до 1M веб-сайтов.
Celery
использует пул gevent
, поскольку у работника много сетевых операций ввода-вывода.Я добавил psycogreen
для исправления postgres, чтобы избежать узких мест.Чтобы избежать достижения максимальных соединений Postgres, я добавил pgbouncer
в качестве прокси-сервера базы данных.
Код находится по адресу: https://github.com/melalj/celery-worker-demo/
Точка входа - ./app/entrypoint.sh
, а логика основного кода - в ./app/worker.py
В этой реализации есть 3 подвопроса:
Как задать размер / настроить переменные?
- Рабочий параллелизм
- SQLAlchemypool_size (обычно это берет на себя pgbouncer)
- worker_prefetch_multiplier
- broker_pool_limit
- Количество реплик работника python (как это повлияет на загрузку базы данных)
Как оптимизировать код?
Кажется, что есть место для улучшения кода, как я могу отследить узкие места (я подозреваю, что это БД или BeautifulSoup, это кажется темной загадкой при использовании Gevent) -и как его оптимизировать?
База данных иногда неожиданно закрывается, почему?
Когда я запускаю код и запускаю с нажатием + 10K.Рабочий зависает после нескольких попыток и время от времени бросает: (psycopg2.OperationalError) server closed the connection unexpectedly
Любые рекомендации о том, как определить размер ресурсов БД для поддержки таких задач?