python-2.7 - Celery 消息队列与 AWS Lambda 任务处理

标签 python-2.7 amazon-web-services nlp celery aws-lambda

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

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

现在原型(prototype)中的分析是一个基本的Python函数,这意味着在大文件上分析需要更长的时间,从而导致API数据桥接到前端期间请求超时。许多文件的分析也是在线性阻塞队列中完成的。

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

我正在使用 Celery 做简单的示例,并发现它适合作为解决方案,但是我只是在 AWS Lambda 中阅读了一些内容,这在纸面上似乎是扩展方面更好的解决方案......

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

谢谢:)

最佳答案

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

也就是说,当规模较小时,即顾客数量较少时, celery 就很棒。不过值得一提的是,在此任务期间,我观察到 CPU 使用率很高。我会为每个客户将此任务添加到 celery 队列中,celery 工作人员将从中获取任务并执行它。

但是当规模变大时, celery 就不再是一个可靠的选择。 CPU 使用率非常高(我不怪罪 celery ,但这就是我观察到的)。不过 celery 还是不错的。但请务必了解这一点,使用 celery 时,您可能会面临缩放问题。垂直缩放可能对您没有帮助。因此,随着后端的增长,您需要水平扩展才能从 celery 获得良好的性能。当队列中等待的任务很多,而worker的数量有限时,自然会有很多任务需要等待。

因此,就我而言,我将这个 CPU 密集型任务移至 AWS Lambda。因此,我部署了一个函数,可以根据客户的对账单数据生成对账单 Pdf,然后将其邮寄。 AWS Lambda 立即解决了我们的扩展问题。其次,由于这更多的是一个周期任务,而不是日常任务 - 所以我们不需要每天运行 celery。 Lambda 将在需要时启动,但在不使用时不会运行。此外,这个函数是在 NodeJS 中的,因为我发现 npm 包比我在 Python 中的解决方案更有效。所以 Lambda 也是有优势的,因为你可以利用各种编程语言的优势,但你的核心可能不会改变。另外,我个人认为 Lambda 相当便宜 - 因为免费套餐每月提供大量计算时间(GB 秒)。此外,您的 Lambda 所在的底层服务器也会在可用时更新到最新的安全补丁。正如您所看到的,我的维护成本大幅下降。

AWS Lambda 可根据需要进行扩展。此外,它们还可以为实时流处理等任务、繁重的数据处理任务或运行 CPU 密集型任务提供良好的用例。

关于python-2.7 - Celery 消息队列与 AWS Lambda 任务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40173481/

相关文章:

amazon-s3 - 如何创建 s3 存储桶、具有 S3 完全访问权限的 IAM 用户以及如何将用户凭据传递到我的应用程序?

java - 使用 OpenNLP 进行句子检测

python - 管道异常 : No mask_token ([MASK]) found on the input

python-2.7 - 统一码编码错误 : 'ascii' codec can't encode characters in position 321-322: ordinal not in range(128)

python - 减少时间消耗

java - 使用同一库的 2 个版本

email - 使用亚马逊SES发送带有附件的电子邮件

python-2.7 - 抓取由javascript生成的链接

python - 了解 NumPy 的卷积

java - OpenNLP 是否在引擎盖下使用 WordNet 进行命名实体识别