Celery 消息队列与 AWS Lambda 任务处理
Celery message queue vs AWS Lambda task processing
目前我正在开发一个系统来分析和可视化基于 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 包的预构建模型和函数。由于我缺乏缩放原型的经验,因此我想询问您的经验和判断哪种解决方案最适合这种情况。
谢谢:)
我想分享一个个人经历。我将繁重的任务转移到了 AWS Lambda,我必须承认投资回报率相当不错。例如,我的任务之一是为客户生成月度报表,然后将它们也邮寄给客户。每个语句的数据都被输入到一个 Jinja 模板中,该模板为我提供了一个 HTML 的语句。使用 Weasyprint,我将 HTML 转换为 Pdf 文件。然后邮寄这些 pdf 报表是最后一步。我研究了直接创建 pdf 文件的各种选项,但它们对我来说并不可行。
也就是说,当规模较小时,即当客户数量较少时,芹菜很棒。不过值得一提的是,在此任务期间,我观察到 CPU 的使用率很高。我会为每个客户将此任务添加到 celery 队列中,celery 工作人员将从中获取任务并执行它。
但是当规模变大时,芹菜并不是一个可靠的选择。 CPU 使用率相当高(我不会为此责怪芹菜,但这是我观察到的)。芹菜还是不错的。但是请理解这一点,对于芹菜,您可能会面临结垢问题。垂直缩放可能对您没有帮助。因此,随着后端的增长,您需要水平扩展才能从 celery 获得良好的性能。当队列中有很多任务在等待,而worker数量有限,自然会有很多任务在等待。
因此,就我而言,我将这项 CPU 密集型任务移至 AWS Lambda。因此,我部署了一个函数,可以根据客户的报表数据生成报表 Pdf,然后将其邮寄出去。 AWS Lambda 立即解决了我们的扩展问题。其次,由于这更像是一项周期性任务,而不是日常任务 - 所以我们不需要每天 运行 芹菜。 Lambda 会在需要时启动 - 但在不使用时不会 运行。此外,这个函数在 NodeJS 中,因为我发现的 npm 包比我在 Python 中的解决方案更有效。所以 Lambda 也有优势,因为您可以利用各种编程语言的优势,但您的核心可能不会改变。此外,我个人认为 Lambda 非常便宜——因为免费套餐每月提供大量计算时间(GB 秒)。此外,您的 Lambdas 所在的底层服务器会在可用时更新到最新的安全补丁。如您所见,我的维护成本大幅下降。
AWS Lambdas 根据需要扩展。此外,它们可以很好地用于实时流处理等任务,或繁重的数据处理任务,或可能非常 CPU 密集的 运行ning 任务。
目前我正在开发一个系统来分析和可视化基于 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 包的预构建模型和函数。由于我缺乏缩放原型的经验,因此我想询问您的经验和判断哪种解决方案最适合这种情况。
谢谢:)
我想分享一个个人经历。我将繁重的任务转移到了 AWS Lambda,我必须承认投资回报率相当不错。例如,我的任务之一是为客户生成月度报表,然后将它们也邮寄给客户。每个语句的数据都被输入到一个 Jinja 模板中,该模板为我提供了一个 HTML 的语句。使用 Weasyprint,我将 HTML 转换为 Pdf 文件。然后邮寄这些 pdf 报表是最后一步。我研究了直接创建 pdf 文件的各种选项,但它们对我来说并不可行。
也就是说,当规模较小时,即当客户数量较少时,芹菜很棒。不过值得一提的是,在此任务期间,我观察到 CPU 的使用率很高。我会为每个客户将此任务添加到 celery 队列中,celery 工作人员将从中获取任务并执行它。
但是当规模变大时,芹菜并不是一个可靠的选择。 CPU 使用率相当高(我不会为此责怪芹菜,但这是我观察到的)。芹菜还是不错的。但是请理解这一点,对于芹菜,您可能会面临结垢问题。垂直缩放可能对您没有帮助。因此,随着后端的增长,您需要水平扩展才能从 celery 获得良好的性能。当队列中有很多任务在等待,而worker数量有限,自然会有很多任务在等待。
因此,就我而言,我将这项 CPU 密集型任务移至 AWS Lambda。因此,我部署了一个函数,可以根据客户的报表数据生成报表 Pdf,然后将其邮寄出去。 AWS Lambda 立即解决了我们的扩展问题。其次,由于这更像是一项周期性任务,而不是日常任务 - 所以我们不需要每天 运行 芹菜。 Lambda 会在需要时启动 - 但在不使用时不会 运行。此外,这个函数在 NodeJS 中,因为我发现的 npm 包比我在 Python 中的解决方案更有效。所以 Lambda 也有优势,因为您可以利用各种编程语言的优势,但您的核心可能不会改变。此外,我个人认为 Lambda 非常便宜——因为免费套餐每月提供大量计算时间(GB 秒)。此外,您的 Lambdas 所在的底层服务器会在可用时更新到最新的安全补丁。如您所见,我的维护成本大幅下降。
AWS Lambdas 根据需要扩展。此外,它们可以很好地用于实时流处理等任务,或繁重的数据处理任务,或可能非常 CPU 密集的 运行ning 任务。