在celery上为python worker(crawler + save db)的最佳设置

时间:2019-03-14 14:42:20

标签: python sqlalchemy celery gevent pgbouncer

我有多个python工作者,它们会爬网某些网站,解析数据并将其存储在Postgres数据库中。

我不清楚如何构建代码以优化服务器资源(在微服务上部署kubernetes上的多个Pod)。假设请求没有速率限制。

出于演示目的,我创建了一个示例代码,该示例代码获取了前10k个网站,并将其存储在数据库中-然后从Bing抓取搜索结果(也将它们存储)。可以扩展到100万个网站。

Celery正在使用池gevent,因为工作进程具有许多网络I / O。 我还添加了psycogreen来修补postgres以避免瓶颈。 为了避免达到Postgres最大连接数,我添加了pgbouncer作为数据库代理。

代码位于: https://github.com/melalj/celery-worker-demo/

入口是./app/entrypoint.sh,主代码逻辑在./app/worker.py

有关此实现的3个子问题:

如何设置/调整变量?

  • 工人并发性
  • SQLAlchemy pool_size(通常由pgbouncer接管)
  • worker_prefetch_multiplier
  • broker_pool_limit
  • python worker的副本数(它将如何影响数据库负载)

如何优化代码?

似乎还有改进代码的空间,如何跟踪瓶颈(我怀疑是db或beautifulsoup,在使用gevent时似乎是个谜)-以及如何对其进行优化?

有时数据库意外关闭,为什么?

当我运行代码并触发+ 10K拉动时。工人在几次拉扯后上吊,偶尔摔倒: (psycopg2.OperationalError) server closed the connection unexpectedly 关于如何调整数据库资源以支持此类任务的任何建议?

0 个答案:

没有答案