对象缓存服务的思考和实现

写在前面

目前在很多业务中,存储都大量的依赖了云存储,比如阿里云的 oss、华为云的 obs 等。但是如果有大量的上传/下载任务,云存储上的网络 I/0 就变成了一个很大的瓶颈。

于是我们打算在内网实现一个对象缓存服务,具体表现为:托管内网上传的对象,并最终转发到云存储;hold 住内网的下载请求,并从云存储把对象下载下来并缓存返回,这样下次该对象的请求就能直接由内网处理。

需要实现的功能

  • 上传/下载接口必须与云存储的一致。这样内部服务接入的时候不用关心是内网还是外网;
  • 域名一致。实现在内网访问,域名转发到缓存服务;在外网访问,域名转发到云存储服务;
  • 缓存服务和云存储服务的交互;比如:内网删除了对象,云储存服务能感知到;云存储服务删除了对象,内网能感知到;
  • 权限问题。缓存服务和云存储服务具有相同共用的权限;

实现思路

上传/下载接口必须与云存储的一致。这一点就是相同的接口分别对应两种实现,一种部署在内网,一种部署在在外网;

域名一致。解析问题找公司的运维配置不同的 DNS 解析即可;

缓存服务和云存储服务的交互问题。就是两个不同环境服务之间的通信问题,大致实现方案有:

  • websocket 长连接
  • 轮询
  • 长轮询
  • SSE
  • 消息队列

相关资料:

最终在实现上选择了长轮训的方案,理由是:即时响应、实现简单、没有很大的连接需求要用到 ws 的地步。

权限问题。权限问题我们参考了 s3-client 的设计思路,颁发给接入端 ak/sk, 然后接入端通过 ak/sk + 参数来生成签名,生成的签名当作认证信息通过 Authorization Header 传递给服务端,和服务端生成的相比较,如果一致则说明认证通过,这样的校验思路不仅能达到认证的目的,也顺便把验签的问题解决了。

值得注意的是,既然叫缓存服务,它就是可以不用保证完全可靠,它应该被设计的足够轻量,尽可能少的依赖外部,并且能够随时被拿掉而不会影响云存储服务。因此在设计上我们选择了依赖 h2 数据库,并且直接用 guava 做内存缓存。

Original: https://www.cnblogs.com/jmcui/p/16537638.html
Author: JMCui
Title: 对象缓存服务的思考和实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579298/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 如果Controller里有私有的方法,能成功访问吗?

    背景 原因 cglib代理的锅 换成JDK动态代理呢 参考 背景 写代码的时候,复制粘贴的时候,没注意到方法的属性,就导致了Controller里有了一个私有的方法,然后访问这个接…

    Java 2023年6月8日
    0102
  • Kafka基本理论

    基本特点 异步解耦、削峰填谷 Topic 分区/分区备份,集群互为某分区备份 broker控制,分区leader/follower 单分区保证消息时间顺序 offset,分区内消息…

    Java 2023年6月9日
    089
  • 2019 年软件开发人员必学的编程语言 Top 3

    AI 前线导读:这篇文章将探讨编程语言世界的现在和未来,这些语言让新一代软件开发者成为这个数字世界的关键参与者,他们让这个世界变得更健壮、连接更加紧密和更有意义。开发者要想在 20…

    Java 2023年6月15日
    083
  • 线程安全的 Set、List

    线程安全的Set: 综上可以看出,线程安全的 Set 底层选用 ConcurrentHashMap 的居多 线程安全的 List: Original: https://www.cn…

    Java 2023年5月30日
    0200
  • 通过源码了解Java的自动装箱拆箱

    什么叫装箱 & 拆箱? 将int基本类型转换为Integer包装类型的过程叫做装箱,反之叫拆箱。 首先看一段代码 public static void main(Strin…

    Java 2023年6月5日
    079
  • 数据结构与算法

    数据结构: 数据结构(英语:data structure)是计算机中存储、组织数据的方式。数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集…

    Java 2023年6月5日
    0139
  • 抽象类和接口,你了解多少?

    现在的java开发一般都说面向接口编程,在开发过程中使用的最多的是给service层每个方法写一个接口,如果用到了DAO层,那么也是一个Mapper接口,之后的事情就交给mybat…

    Java 2023年6月9日
    086
  • CentOS7下FTP的安装与配置2

    1、安装 yum install -y vsftpd 2、配置FTP 3、建立用户文件 4、生成用户加密数据 5、修改 /etc/pam.d/vsftpd 文件 6、新建系统用户t…

    Java 2023年5月29日
    091
  • 【JAVA代码审计】某电商传销系统代码审计几处0day

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/sevck/p/16544112.htmlAuthor:…

    Java 2023年5月29日
    092
  • ||运算你真的了解吗?

    或运算介绍 或运算:只要有一个条件为true,即为true。 通过如上逻辑关系图,还有另外一层 隐含的意思: 如果A条件是true,B条件不执行! 如果A条件是false,B条件要…

    Java 2023年6月8日
    076
  • Spring Boot打包的jar包指定配置文件启动

    Spring Boot会按照下列优先级来加载application.properties配置文件,由高到低依次为: jar包同级目录下的config目录下的application….

    Java 2023年6月16日
    071
  • 普通企业的规划类项目中,OptaPlanner更适合作为APS的规划优化引擎

    在企业的规划、优化场景中,均需要开发规划类的项目,实现从各种可能方案中找出相对最优方案。如排班、生产计划(包括高层次的供应链优化,到细粒度的车间甚至机台作业指令)、车辆调度等。因为…

    Java 2023年6月16日
    097
  • Flutter Pub发布失败

    csharp;gutter:true; Do you want to publish rome_bus 0.0.2 (y/N)? y Uploading… (1.3s) Fai…

    Java 2023年5月29日
    079
  • 推荐一款企业管理专用低代码工具,实现开发系统自由!

    之前分享过很多类型的文章,但是发现大家对低代码相关的文章,兴致还是比较高的,争议也很大。因为不少人认为低代码太草率,但真正的低代码不仅要负责生成代码,还要负责代码的维护,把它当做一…

    Java 2023年6月5日
    0140
  • IO in JAVA

    java io 涉及应用程序的网络通信 or 文件读取. 采用了装饰者模式可以为不同的流添加不同的功能. java io提供了 BIO/NIO/AIO的支持java Netty I…

    Java 2023年6月7日
    095
  • hutool包里的ObjectUtil.isNull和ObjectUtil.isEmpty的区别

    大家都用过 hutool包把,包路径为: cn.hutool.core.util,最近再使用的过程中一直没高明白ObjectUtil.isEmpty和ObjectUtil.isNu…

    Java 2023年6月7日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球