老哥们,现在碰到一个需求,希望大家帮忙看看,有什么方案。 我是 Java 菜鸡,可能提到的某些点很傻很无知,望见谅。
后台有这样一个接口 /demo ,前端请求到 /demo 后,代码需要按照顺序访问多个外部 HTTP 接口
比如外部接口有三个:
前端请求 /demo 后,后端直接返回 response 200 "ok" 就行,不用阻塞。
每个外部接口的一些传参都依赖于前一个请求的返回值(/api-c 的传参依赖于/api-b ),所以顺序是一定的,只能一个个请求。
最终结果(最后一个接口 /api-c 响应后),返回结果存入数据库。
另外,中间可能会出现 timeout 或者其他异常,这些信息也需要存入数据库。
问题在于,请求的并发量略微大了些,大概一秒钟有上百个请求进来(可以简化成每一秒就有 120 个请求进入该接口)。
机器:单个虚拟机,CPU 和内存都可以按需求往上调大,目前是 18 核 48GB 的配置。
语言:Java 21 (抱歉,其他语言不会,只能用这个)
框架:SpringBoot3
数据库:PG 、Redis 、Mongo (随意使用)
我的方法很直接,把请求的外部方法的代码放在一个 service 函数里,然后加 @Async 注解。
然后配置 ThreadPoolTaskExecutor (就是网上都能搜到的那些配置)。
另外,为了追踪每一个任务线程的结果,在线程里,一开始就生成一个 UUID ,然后构造一个对象,每一步都把相应的信息(成功或者失败)存入这个对象,最后以这个 UUID 为主键存储到数据库里。
按照我自己的观察,如果线程数量给小了,就容易产生队列堆积,给大了,又不确定该给多大,难道只能测试?
我的理解大概是 100 个请求进来,假设外部 3 个接口,每个需要 5 秒,那么全部请求完就是 15 秒(忽略其他时延),100 * 15 = 1500 个线程,如果小于这个值,就会堆积在队列中。
我想知道是否能根据以下的变量,通过某种方法推算出这个接口的理论的上限?
怎么计算,并且达到这个上限?有什么更好的方法么?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.