目前我正在开发一个系统来分析和可视化基于NLP的文本数据。
后端( Python + Flask + AWS EC2 )处理分析,并使用API将结果反馈回前端( FLASK + D3 + Heroku )专门处理交互式可视化的应用程序。
现在原型中的分析是一个基本的python函数,这意味着在大型文件上分析需要更长时间,从而导致API数据桥接到前端期间的请求超时。以及许多文件的分析都是在线性阻塞队列中完成的。
因此,为了扩展这个原型,我需要将Analysis(text)
函数修改为后台任务,这样它就不会阻止进一步的执行,并且可以在函数完成后进行回调。输入文本从AWS S3获取,输出是一个相对较大的JSON格式,旨在存储在AWS S3中,因此API桥接器将简单地获取包含前端应用程序中所有图形数据的JSON。 (我发现S3比创建一个大的关系数据库结构来存储持久数据更容易处理..)
我正在使用Celery进行简单的示例,并发现它适合作为解决方案,但我只是在AWS Lambda中进行了一些阅读,这在纸上看起来似乎是一个更好的解决方案......
Analysis(text)
函数使用预构建的模型,并使用相对常见的NLP python包。由于我在缩放原型方面缺乏经验,我想询问您的经验,并判断哪种解决方案最适合这种情况。
谢谢:)
答案 0 :(得分:2)
我想分享一下个人经历。我将繁重的任务转移到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密集型任务等任务提供良好的用例。