【问题标题】:Scaling workers for 10M+/day job queue为 10M+/天的作业队列扩展工作人员
【发布时间】:2017-02-01 23:06:09
【问题描述】:

我们想升级我们基于 PHP 的 AWS SQS 队列工作器架构,因为我们每天要处理超过 1000 万个作业,而且基础设施变得越来越昂贵。

我们的作业几乎不使用任何内存,但由于 HTTP 响应缓慢,每个作业可以运行 5-10 秒。

谁能推荐支持在同一台机器上同时运行数十个工作人员或可以非常高效地同时执行数十个作业的语言、方法或工具?

非常感谢!

【问题讨论】:

    标签: amazon-web-services queue message-queue amazon-sqs


    【解决方案1】:

    如果瓶颈在 HTTP 请求中,您应该考虑使用 node.js。它使您的代码编程变得非常容易,因此它可以异步运行。我假设在您当前的实现中,HTTP 请求阻塞了 CPU 线程。这是低效的,因为 CPU 可以在 等待请求完成时执行其他操作,然后它可以解析结果。这在 node.js 和优秀的 async 库中几乎是微不足道的。

    异步实现可以将您的程序加速 10-100 倍甚至更多。特别是如果“等待 HTTP 请求”比实际计算花费更多的时间。使用一组 micro 或 nano 实例,node.js(或一般的 javascript)是一种单线程语言,因此通常不需要多个内核。

    另一种方法是将 SNS 服务附加到 SQS 并设置解析票证的 Lambda 函数。有关AWS Lambda 的介绍,请参阅此页面。也许你有高峰日和低谷日,那么这种做法应该更划算。当负载均匀分布时,AWS Lambda 比 EC2 更昂贵。

    【讨论】:

    • 谢谢!你能解释一下在这种情况下你会使用谁的异步库吗?我假设我们使用 Node.js 的集群在同一台机器上启动多个 worker,然后在这些 worker 上使用异步库?
    • 您可以使用 SQS 批量 API 调用获取一批工单,然后对所有工单使用 async.each 函数。它将同时开始下载并在 HTTP 请求完成后处理它们。您可以使用微实例,因为 node.js 仅使用 1 个核心。您也可以采用多核实例,然后启动代码的多个实例,但我建议改为使用许多单核机器(更多控制)
    【解决方案2】:

    我运行过类似的系统,在多台机器上运行了 30-200 多个基于 PHP CLI 的 worker。我用 Supervisord 启动它们,其中有一个“numprocs”配置,说明要启动多少个特定程序。您可以拥有多个这样的配置组。

    在优化成本方面,考虑“现场实例”以降低每台机器每小时的价格。为了让每个系统尽可能快地运行,您需要确保它们已预先设置好所需的所有已安装软件和配置。

    【讨论】:

    • 谢谢!所以你在同一台机器上同时运行 20-200 名工人?您是否使用任何特定的工作人员?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多