目前我正在开发一个系统来分析和可视化基于NLP的文本数据.
后端(Python Flask AWS EC2)处理分析,并使用API将结果反馈给仅处理交互式可视化的前端(FLASK D3 Heroku)应用程序.
现在原型中的分析是一个基本的python函数,这意味着在大文件上分析需要更长的时间,从而导致API数据桥接到前端期间的请求超时.以及许多文件的分析都是在线性阻塞队列中完成的.
因此,为了扩展这个原型,我需要将Analysis(文本)函数修改为后台任务,这样它就不会阻止进一步的执行,并且可以在函数完成后进行回调.输入文本从AWS S3获取,输出是一个相对较大的JSON格式,旨在存储在AWS S3中,因此API桥接器将简单地获取包含前端应用程序中所有图形数据的JSON. (我发现S3比创建一个大的关系数据库结构来存储持久数据更容易处理..)
我正在用Celery做一些简单的例子,并发现它适合作为解决方案,但我只是在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秒).此外,您的Lambdas需要注意的基础服务器会在可用时更新为最新的安全修补程序.如您所见,我的维护成本急剧下降.
AWS Lambdas根据需要进行扩展.此外,它们可以为实时流处理,大量数据处理任务或运行CPU密集型任务等任务提供良好的用例.