每小时调用外部 API 并分别执行约 10000 行任务的作业

如何解决每小时调用外部 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 RunApp 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 上的并行实例数。有了它,您可以限制成本,还可以限制处理能力。

现在,关于延迟,当然有不同的来源。

  1. 当您在 PubSub 中发布消息时,在第一个创建和第 10k 个之间存在“延迟”。
  2. 每次Cloud Run平台创建一个新实例时,该实例都需要启动并初始化其运行环境(称为冷启动);根据您的开发语言和设计,它可能需要几毫秒(大约 200 - 500)或几秒钟(例如 Spring Boot)。您可以想象使用 min instance 功能来为多个实例保温,从而限制 clod start 的数量。但是,每小时运行 1 次,此功能对您来说可能太贵了(IMO,我不推荐此功能)
  3. 在同一个实例上,如果您同时处理 250 个请求,它们必须共享相同的 CPU 资源,并且某些请求将等待获取 CPU 时间进行处理。您可以增加 CPU 数量以减少此延迟(例如设置 4vCPU),但这是任何多线程系统的正常行为。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res