• 服务间是否应该提供批量接口?


    背景

    昨天跟同事聊天,他提了一个问题,我觉得挺有意思,分享给大家。

    原话是这样的:我提供了一个批量锁库存的接口,结果那谁传了十万条数据过来,把我弄死了,麻蛋,我就不应该给他提供这个批量的接口,我现在怎么办?(头大)

    所以,我们应不应该提供批量的接口呢?

    我认为不应该提供。

    动机

    首先,我们分析一下需要批量的动机。

    客户端(调用者)想把数据组装成一个大List批量调用你的接口,肯定是考虑到如果一条一条调用你,中间的网络开销非常大,浪费很多时间,所以,他认为批量调用你的接口,可以把这一部分耗时给节约了,提高他接口的响应速度。

    危害

    然后,我们再分析一下如果你提供了批量接口,会出现哪些危害呢。

    第一点,客户端相当于把他的压力转移到你这里了,整个系统出现问题,谁背锅,无需多言了。

    第二点,本来客户端一个请求一个请求来调用你的,你可以部署10台机器来抗并发,结果现在一个请求过来10万数据,全部打到你的一台机器的一个线程中,你怎么处理?多线程?多线程你也是在一台机器里面搞。加消息队列再分发?这无疑大幅度增加了你的设计复杂度。

    第三点,现在是10万数据,以后呢?会不会出现100万、1000万来调你?不可控,只要你提供了,别人就可能来搞你。

    所以,无论怎么看,你都不应该提供批量接口,只要你提供了,无疑是在作死,而且死的心安理得,因为确实是你的问题,你跟客户端撕逼可能都撕不过。

    因此,千万不要提供批量接口。

    客户端调用的正确姿势

    那么,问题来了,如果不提供批量接口,客户端怎么加快他的处理速度呢?

    客户端应该改变思维,不是一个请求一个请求的同步调用你的接口,而应该多个请求异步并发调用你的接口,这样,你这边完全不用修改,只要简单的加机器就可以轻松实现无限扩容。

    但是,客户端的代码并没有那么好写,在java中,就是使用Future啦,或者直接使用Completable Future,有兴趣的可以去看看Dubbo的源码,新版本已经全部改成使用CompletableFuture来实现远程调用了,当然,dubbo本身就是支持异步调用的,用起来很简单,但是如果你是feign可能需要自己包一层了。

    好了,今天我们这里说的客户端实际上是后端服务之间的调用,不包含前端那种批量导入的场景,就先分享到这里了。

    结语

    最后,我想问,你们的系统服务之间有没有批量的接口呢?又是怎么处理这种大请求的呢?

    欢迎留言讨论。

  • 相关阅读:
    ffmpeg rtmp推流 视频转码
    java日志发展史 log4j slf4j log4j2 jul jcl 日志和各种桥接包的关系
    nginx stream 流转发,可以转发rtmp、mysql访问流,转发rtmp、jdbc请求
    java web http 转https 通过nginx代理访问
    linux 服务器磁盘挂载
    novnc 通过websockify代理 配置多点访问
    linux 文件服务 minio 安装部署配置
    AOP实现原理,手写aop
    java 泛型
    JAVA反射getGenericSuperclass()用法
  • 原文地址:https://www.cnblogs.com/tong-yuan/p/14357067.html
Copyright © 2020-2023  润新知