如何解决每小时调用外部 API 并分别执行约 10000 行任务的作业
我目前正在考虑设计一个系统,该系统基本上需要每小时运行一次作业,但大约需要 10,000 行。然后,这些行中的每一行都需要调用外部 api 并在分析方面做一些其他的工作。
我目前正在努力找出实现这一目标的最佳方法,但我以前从未做过这样的事情,因此希望得到任何人的建议或指导。我主要习惯于 GCP,所以我将我的想法集中在那里可用的工具上(这也很可能在 JS/Node 环境中完成)。
我对设计的初步想法如下。
- 使用 Cloud Scheduler 创建每小时运行一次的作业
- 云调度器触发云函数
- Cloud 函数检索所有必要的行并在主题中为每一行创建发布/订阅消息。
- Cloud pub sub 然后触发另一个云函数,该函数调用外部 API 并为该行执行其他任务,并将数据写回到需要去的地方。
- 鳍
我将第一个函数添加到队列的理由显然是一个云函数受执行时间和内存的限制,所以我认为让一个函数尝试自己处理所有行是不明智的。我假设 pub/sub 每次都会触发该函数的一个新实例而不是覆盖第一个实例?
我认为理论上我可以批量处理一些外部 API 调用,一次最多可能多达 20 个左右,所以我不知道这是否会/应该对上述设计产生影响。
我显然也希望这样做的成本尽可能低,所以我不知道让应用引擎实例这样做是否会更好?但是我也不知道我是否会在那里遇到内存和超时问题。
我在写这篇文章时想到的一个想法是,我是否可以按原样批处理这些批次。来自 JS 背景,我可以创建所有批处理 API 调用并在 Promise.all() 调用中执行它们。再次不确定它对内存和性能的影响,所以我想我需要测试它。
有没有人注意到上面有任何漏洞,或者有更好的解决方案吗?
谢谢
解决方法
您设计的第一部分是正确的(Cloud Scheduler -> CLoud Functions -> PubSub 中的消息)。
在这里,每条消息都会调用一个 Cloud Functions 函数。 IMO,这不是最佳选择,因为您一次只能在 Cloud Functions 实例上处理 1 个请求。如果您执行外部 API 调用,您将白白浪费时间(您将等待答案,什么都不做)。
更好的解决方案是使用管理并发请求的产品,例如 Cloud Run 或 App Engine。使用 Cloud Run,您最多可以同时处理 250 个请求,但使用 App Engine 时只能处理 80 个。
通过使用这种解决方案,您将节省大量金钱和时间。
关于批处理,我不太明白。
- 如果您可以在向外部 API 的 1 个请求中发送 20 个消息中包含的 20 个值,是的,最好对请求进行批处理(在您的第一个 Cloud Functions 中创建 20 条消息的块)
- 如果你继续一个一个地发送请求,但你使用了语言的并发能力(Node 或 Go 非常少),那么与一个个地处理消息相比,没有真正的优势。
事实上,你会减少调用次数(但它真的很便宜),相反,会增加代码的复杂性。不确定值不值得。
编辑 1
事实上,PubSub 不会产生任何 Cloud Run 实例。 PubSub 订阅仅将消息推送到 URL。 PubSub 的工作到此结束。
现在,在 Cloud Run 端,服务根据 HTTP 流量进行扩展。因此,平台选择创建 1、2 或更多实例来吸收流量。在您的情况下,平台将创建大量实例(我认为大约有 100 个),但您只需为实例处理流量付费。无需处理请求,无需计费。
您还可以使用 max instance 参数限制 Cloud Run 上的并行实例数。有了它,您可以限制成本,还可以限制处理能力。
现在,关于延迟,当然有不同的来源。
- 当您在 PubSub 中发布消息时,在第一个创建和第 10k 个之间存在“延迟”。
- 每次Cloud Run平台创建一个新实例时,该实例都需要启动并初始化其运行环境(称为冷启动);根据您的开发语言和设计,它可能需要几毫秒(大约 200 - 500)或几秒钟(例如 Spring Boot)。您可以想象使用 min instance 功能来为多个实例保温,从而限制 clod start 的数量。但是,每小时运行 1 次,此功能对您来说可能太贵了(IMO,我不推荐此功能)
- 在同一个实例上,如果您同时处理 250 个请求,它们必须共享相同的 CPU 资源,并且某些请求将等待获取 CPU 时间进行处理。您可以增加 CPU 数量以减少此延迟(例如设置 4vCPU),但这是任何多线程系统的正常行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。