连接到数据库

时间:2016-06-08 16:40:57

标签: python sql postgresql architecture daemon

我正在研究一个学习Python,SQL,Javascript,运行服务器的项目 - 基本上掌握了全栈。现在我的基本目标是:

我想无限地运行Python脚本,它不断地对不同的服务进行API调用,这些服务具有不同的速率限制(例如200 /小时,1000 /小时等)并将结果(int)存储在数据库中(PostgreSQL的)。我希望在一段时间内存储这些结果,然后开始处理这些数据,以便在前面显示有趣的内容。我需要这个全天候运行。我试图在这里了解一般的架构,并且周围的搜索已经证明非常困难。粗糙伪代码的基本思想是:

database.connect()
def function1(serviceA):
  while(True):
    result = makeAPIcallA()
    INSERT INTO tableA result;
    if(hitRateLimitA):
       sleep(limitTimeA)
def function2(serviceB):
  //same thing, different limits, etc.

然后我会进入我的服务器,运行python myScript.py &,关闭我的笔记本电脑,等待数据滚动。这是我的问题:

  • 这种方法是否有意义,或者我应该做一些完全不同的事情?
  • 是否考虑过"糟糕"或者像这样无限期地打开数据库连接很危险?如果是这样,我该如何管理数据库?
  • 我考虑使用cron之类的调度程序,但速率限制是可变的。当我的极限被击中时,我不能每小时运行一次脚本,比如5分钟进入开始时间并且等待时间为60分钟。即使每隔一段时间运行它也会显得凌乱:我需要睡眠持续的速率限制等待时间,这将持续变化。假设调度程序不是去这里的方法,我是否正确?
  • 如何优雅地处理任何意外的潜在致命错误(即记录和重新启动)?手动删除脚本或编辑脚本怎么样?

我有兴趣在这里学习不同的方法和最佳实践 - 非常感谢任何和所有建议!

1 个答案:

答案 0 :(得分:1)

我实际上完全按照您的个人应用程序执行操作,我可以解释如何执行此操作。

我使用Celery而不是cron,因为它允许更好地调整调度,它是Python而不是bash,所以它更容易使用。我有不同的任务(基本上是一组API调用和数据库更新)到不同的时间间隔运行的不同站点,以考虑各种不同的速率限制。

我将Celery应用程序作为服务运行,因此即使系统重新启动,重启应用程序也是微不足道的。

我广泛使用我的应用程序中的日志库,因为当你拥有的是一个难以阅读的堆栈跟踪时,很难调试某些东西。我在整个应用程序中传播了INFO级别和DEBUG级别的日志,并且任何WARNING级别和以上日志都会打印到控制台并发送到我的电子邮件。

对于异常处理,我准备的大部分内容都是速率限制问题和随机连接问题。确保在try-except语句中包含您发送到API端点的任何HTTP请求,并且可能只实现重试机制。

就数据库连接而言,连接的时间长短并不重要,但是您需要确保在try-except语句中包围主应用程序循环,并通过关闭连接确保它正常失败例外的情况。否则,您可能最终会遇到大量的ghost连接,并且在这些连接消失之前,您的应用程序无法重新连接。