java 脑洞 - 缓冲调用 开源模块

脑洞的由来

场景一:分页查询,某商品首页展示
场景二:缓存分担压力,缓存失效导致大量请求去到下流服务,导致雪崩

缓冲调用和缓存的区别

首先缓冲调用和缓存并不是互相替代的,缓冲调用是瞬点高并的补充优化方案,在某些特殊场景会发挥很大的功效。缓冲调用和缓存的区别,缓冲调用不保留数据,所以无需维护数据的一致性等等,缓冲调用只会增加新生代内存,调用完之后就会删除对应的Future,最后再讨论下缓冲调用的效率问题,缓冲调用最长时间是一次完整调用,最短时间是无须调用就获得结果,所以在调用效率上也会有优化。

更多demo请关注

springboot demo实战项目
java 脑洞
java 面试宝典
开源工具

功能描述

同一时刻多条线程携带同一参数调用同一接口,把调用过程包装成FutureTask,每条线程通过获取到的FutureTask获得返回值

image.png

PS:

缓冲调用出来的对象是同一个对象,在使用时需要注意

核心源码详解

public <T> T execute(String callKey, long waitTime, VoidBufferCall<T> invoke) throws BufferCallException {
        // 包装FutureTask
        Future<T> future = new FutureTask<>(() -> {
            try {
                T value = invoke.call();
                return value;
            } catch (Throwable throwable) {
                if (throwable instanceof Exception) {
                    throw (Exception) throwable;
                } else {
                    throw new Exception(throwable);
                }
            } finally {
                //  执行完移除
                futureMap.remove(callKey);
            }
        });
        // 把FutureTask根据callKey放入Map中,如果已存在则获取旧的FutureTask;
        Future oldFuture = futureMap.putIfAbsent(callKey, future);
        if (oldFuture == null) {
            // 如果是新的FutureTask,则执行
            ((FutureTask) future).run();
        } else {
            future = oldFuture;
        }
        try {
            if (waitTime > 0) {
                return future.get(waitTime, TimeUnit.MILLISECONDS);
            } else {
                // 获取调用返回值并返回
                return future.get();
            }
        } catch (Exception e) {
            throw new BufferCallException(callKey, e);
        }
    }

源码项目

github : https://gitee.com/wqrzsy/lp-buffercall.git

lp-buffercall

缓冲调用的核心项目

lp-buffercall-spring

lp-buffercall的扩展项目,引入spring来做AOP,可以通过注解来实现调用

调用示例

@Component
public class TestService {

    @BufferCall
    public String test(@CallKey String name) {
        return name + "- Hello !";
    }

}

PS: @CallKey 如果没有则默认全参数

公众号

五分钟了解前沿技术,大数据,微服务,区域链,提供java前沿技术干货,独立游戏制作技术分享

五分钟技术

如果这篇文章对你有帮助请给个star


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.JVM 堆内存和非堆内存 堆和非堆内存按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据...
    yanzhu728阅读 4,476评论 0 0
  • 不足的地方请大家多多指正,如有其它没有想到的常问面试题请大家多多评论,一起成长,感谢!~ String可以被继承吗...
    启示录是真的阅读 8,091评论 3 3
  • 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: -- 抽象:抽象是将一类对象的共同特征总结...
    ccc_74bd阅读 4,569评论 0 1
  • 1.StringBuffer与String的区别 StringBuffer是线程安全的,每次操作字符串,Strin...
    zdd5457阅读 4,680评论 0 5
  • 包含的重点内容:JAVA基础JVM 知识开源框架知识操作系统多线程TCP 与 HTTP架构设计与分布式算法数据库知...
    消失er阅读 9,868评论 1 10

友情链接更多精彩内容