V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Nillouise
V2EX  ›  程序员

Java 怎么 300TPS 地去请求一个接口?

  •  
  •   Nillouise · 2021-04-20 01:56:28 +08:00 · 2386 次点击
    这是一个创建于 1299 天前的主题,其中的信息可能已经有所发展或是发生改变。

    功能是查询出用户,然后给这些用户发推送,目前推送速率限制是 300/s, 应该单机就能满足需求,能有多机方案也好,不过还是需要清楚单机能不能做到这个速度。

    目前的设计方案是单线程作为生产者查询数据库放到 blockqueue,然后多个消费者消费这个 blockqueue,并发送推送,流控用 guava 的 RateLimiter 。生产者单线程查询数据库,一秒查 300 个以上应该是可以的。

    问题: 1,消费者单线程能做到 300/s 发送(用 netty 之类的类库可以做到吗?)? Spring 自带的 resttemplate 应该根本不可能满足这个要求吧?

    2,如果是多线程,方案是怎么样?一个线程也需要多个消费者?线程的数量要怎么确定比较好(因为服务还有其他功能需要使用,如果线程太多会不会影响其他功能?)。

    3,300/s,假设每个请求(包括返回) 100kb,那每秒流量就是 30mb,所以应该是单机就能承受的,是这样计算的吗?

    感觉提问有点太多啰嗦和细节,大家能给个方向意见也行~

    11 条回复    2021-04-22 09:26:18 +08:00
    chendy
        1
    chendy  
       2021-04-20 02:01:56 +08:00
    1. RestTemplate 本身只是上层封装,具体性能依赖底层实现
    2. 一个线程一个消费者,满足每秒 300 就行
    3. 看机器带宽
    自己实验自己调整吧
    Nillouise
        2
    Nillouise  
    OP
       2021-04-20 03:18:13 +08:00
    @chendy 但 restTemplate 的设计好像是单线程单个调用的,上层 API 调用似乎没有能回调、future 之类的单线程并发接口,这种情况下是要怎么实现单线程多并发请求的功能?
    nauhc
        3
    nauhc  
       2021-04-20 07:50:19 +08:00
    @Nillouise 我觉得你的理解没什么问题,RestTemplate 确实是同步调用,你可以试试 AsyncRestTemplate 。
    speedofstephen
        4
    speedofstephen  
       2021-04-20 07:52:30 +08:00
    消费者多线程应该很容易实现吧。应该随便找个非阻塞的 HttpClient 库就行。我最近用 Vertx 的 WebClient 。1000/s 没问题,不过我的请求没你这么大。 而且它并不需要创建很多线程,实现原理我说不好,你可以看下官方的文档。
    css3
        5
    css3  
       2021-04-20 09:18:30 +08:00
    jmeter ?
    dbpe
        6
    dbpe  
       2021-04-20 09:34:36 +08:00
    @speedofstephen IO 复用,全程异步,比 Spring 高哪里去了
    CantSee
        7
    CantSee  
       2021-04-20 10:45:55 +08:00   ❤️ 1
    Spring WebClient? 异步非阻塞的
    Nillouise
        8
    Nillouise  
    OP
       2021-04-20 14:52:26 +08:00
    @nauhc @CantSee AsyncRestTemplate 似乎已经 deprecated 了,我搜了一下代替的 Spring client,好像符合要求,但我搜了一下没找到这东西的线程模型的解释,如果是用线程池实现的,感觉不如 vertx 那种单线程的 eventloop 。

    @speedofstephen 不错,应该可以单独集成到 spring boot 项目吧,我之后研究一下。
    zeni123
        9
    zeni123  
       2021-04-21 00:38:19 +08:00 via iPhone
    用 Spring WebClient 就可以了, 非阻塞的
    speedofstephen
        10
    speedofstephen  
       2021-04-21 07:17:15 +08:00
    @Nillouise 更正一下 不是单线程,是少量
    Chinsung
        11
    Chinsung  
       2021-04-22 09:26:18 +08:00
    jmh 了解一下,你这个只基于数据库和线程,最多结合一下 junit+jmh,本地跑起来评估一下性能。
    建议用 netty 自己写或者找个基于 netty 的 client,否则线程和 IO 可能会有问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2773 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 01:53 · PVG 09:53 · LAX 17:53 · JFK 20:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.