我需要您对我面临的挑战发表意见。我正在建立一个网站,使用Django作为后端,使用PostgreSQL作为我的数据库,使用GraphQL作为我的API层,使用React作为我的前端框架。网站托管在Heroku上。我编写了一个python脚本,该脚本可以将我登录到gmail帐户,并根据预定义的条件解析几封电子邮件,然后将解析后的数据存储到Google表格中。现在,我希望脚本成为我的网站的一部分,用户可以在其中指定确切需要解析的内容(即过滤器),然后将解析后的数据显示在表格中以查看解析任务的准确性。
我需要帮助的部分是如何设计这样的工作流程。经过一番谷歌搜索后,下面是一些我能想到的想法:
实现此功能的最佳做法是什么?任务可以是任何东西,不必解析电子邮件。它也可以从excel导入数据。用户生成的任何任务,而不是计划或重复的任务。
如果这个问题对你们中的某些人来说微不足道,我先感到抱歉。我不是专业开发人员,因此上述项目是我提高技术技能和学习新技术的一种方式。
期待从您的经验中学习。
您可以将问题分解为以下步骤:
您可以执行所有这些操作:
您可以在生成响应时运行脚本,但是它具有以下缺点:
然而,这种方法的优点在于它很简单。为此,您可以仅通过请求传递参数,服务器解析并执行脚本,然后返回结果。
无需设置消息队列,任务计划程序或任何所需的程序。
尽管理想情况下,对于长时间运行的任务,最好在通常的请求-响应循环之外执行此操作,以获取以下优点:
这样做的缺点是您现在必须设置更多的东西,这增加了项目的复杂性和故障点。
无论您选择什么,通常最好遵循生产者-消费者模式:
生产者基本上就是您,用户。您指定任务以及该任务中涉及的参数。
此队列可以是任何数据存储:像Redis这样的内存中数据存储;像RabbitMQ这样的消息传递队列;或诸如PostgreSQL之类的关系数据库管理系统。
使用者是您执行这些任务的脚本。运行使用者/脚本的方式有多种:通过您提到的Celery,它运行多个工作程序来执行通过队列传递的任务;通过一个简单的基于时间的作业调度程序(例如crontab);甚至您手动触发脚本]
这个问题实际上并不简单,因为解决方案取决于您实际要执行的任务。最好评估约束条件,参数和实际任务,以决定选择哪种方法。
请保持简单,除非您有令人信服的理由(例如,服务器已瘫痪,或者实际上互联网连接不可靠),否则实际上没有理由花哨。
任务越阻塞,任务花费的时间越长,或者通过网络对第三方API的依赖程度越高,将其推送到后台进程以增加可靠性和弹性就越有意义。