Python 2.7 芹菜消息队列与AWS Lambda任务处理

Python 2.7 芹菜消息队列与AWS Lambda任务处理,python-2.7,amazon-web-services,nlp,celery,aws-lambda,Python 2.7,Amazon Web Services,Nlp,Celery,Aws Lambda,目前,我正在开发一个基于NLP的文本数据分析和可视化系统 后端(Python+Flask+AWS EC2)处理分析,并使用API将结果反馈给只处理交互式可视化的前端(Flask+D3+Heroku)应用程序 目前,原型中的分析是一个基本的python函数,这意味着在大型文件上,分析需要更长的时间,因此在API数据桥接到前端期间会导致请求超时。以及许多文件的分析是在一个线性阻塞队列中完成的 因此,为了扩展这个原型,我需要将Analysis(text)函数修改为后台任务,这样它就不会阻止进一步的执行

目前,我正在开发一个基于NLP的文本数据分析和可视化系统

后端(Python+Flask+AWS EC2)处理分析,并使用API将结果反馈给只处理交互式可视化的前端(Flask+D3+Heroku)应用程序

目前,原型中的分析是一个基本的python函数,这意味着在大型文件上,分析需要更长的时间,因此在API数据桥接到前端期间会导致请求超时。以及许多文件的分析是在一个线性阻塞队列中完成的

因此,为了扩展这个原型,我需要将
Analysis(text)
函数修改为后台任务,这样它就不会阻止进一步的执行,并且可以在函数完成后进行回调。输入文本是从AWS S3获取的,输出是一种相对较大的JSON格式,目的是存储在AWS S3中,因此API桥接器只需获取包含前端应用程序中所有图形数据的JSON。(我发现S3比创建一个大型关系数据库结构来存储持久数据稍微容易一些。)

我用芹菜做了一些简单的例子,发现它适合作为解决方案,但我只是读了一些AWS Lambda的书,它在纸上看起来是一个更好的解决方案

Analysis(text)
函数使用预构建的模型和来自相对常见的NLP python包的函数。由于我缺乏扩展原型的经验,我想询问您的经验和判断哪种解决方案最适合此场景


谢谢:)

我想和大家分享一下个人经历。我把我的繁重任务转移到了AWS Lambda,我必须承认投资回报率相当不错。例如,我的任务之一是为客户生成月度报表,然后将其邮寄给客户。每个语句的数据都被输入到一个Jinja模板中,该模板给了我一个语句的HTML。使用Weasyprint,我将HTML转换为Pdf文件。最后一步是邮寄那些pdf声明。我研究了各种直接创建pdf文件的选项,但它们对我来说并不可行

也就是说,当规模较低时,即当顾客人数较少时,芹菜非常棒。不过,在这个任务中,我观察到CPU使用率很高。我将为每个客户向芹菜队列添加此任务,芹菜工人将从中提取任务并执行它

但当比例上升时,芹菜并不是一个很好的选择。CPU使用率相当高(我不怪芹菜,但这就是我观察到的)。不过芹菜还是不错的。但你要明白,芹菜会让你面临结垢问题。垂直缩放可能对您没有帮助。因此,您需要随着后端的增长进行水平扩展,以便从芹菜中获得良好的性能。当队列中有很多任务等待,并且工人数量有限时,自然会有很多任务需要等待

所以在我的例子中,我将这个CPU密集型任务转移到AWS Lambda。因此,我部署了一个函数,该函数将从客户的报表数据生成报表Pdf,然后将其发送出去。AWS Lambda立即解决了我们的缩放问题。其次,因为这是一项周期性任务,而不是日常任务,所以我们不需要每天都做芹菜。Lambda将在需要时启动,但在不使用时不会运行。此外,这个函数在NodeJS中,因为我发现npm包比我在Python中的解决方案更有效。所以Lambda也很有优势,因为您可以利用各种编程语言,但您的核心可能没有改变。另外,我个人认为Lambda相当便宜——因为免费层每月提供大量计算时间(GB秒)。此外,在lambda所在的基础服务器上,如果可用,则应将其更新为最新的安全修补程序。正如你所看到的,我的维护费用已经大幅下降

AWS Lambdas刻度可根据需要调整。此外,它们还可以为实时流处理等任务、繁重的数据处理任务或运行CPU密集型任务提供很好的用例。

^ Sλman谢谢+惯性导航与制导