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

写在前面

目前在很多业务中,存储都大量的依赖了云存储,比如阿里云的 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)

大家都在看

  • 应用启动加速-并发初始化spring bean

    背景 随着需求的不断迭代,服务承载的内容越来越多,依赖越来越多,导致服务启动慢,从最开始的2min以内增长到5min,导致服务发布很慢,严重影响开发效率,以及线上问题的修复速度。所…

    Java 2023年6月8日
    074
  • fastposter发布1.4.3 跨语言的海报生成器

    fastposter发布1.4.3 跨语言的海报生成器 v1.4.3 增加golang语言支持,优化生成器代码,完善官方文档 昨天喝了点小9️⃣,发版慢了些。 future: 增加…

    Java 2023年6月5日
    084
  • PDF转图片,拼接图片

    一、导入PDF处理的包 阿里云仓库搜索icepdf-core依赖,找到合适的版本,导入pom.xml文件。 二、PDF转图片存储 1、读取目标PDF文件; 2、创建Document…

    Java 2023年6月5日
    085
  • Spring注解开发_Spring容器创建概述

    浅尝Spring注解开发,基于Spring 4.3.12概述Spring容器创建的过程,包括12个方法的执行 概述12个方法 //获取ioc容器 AnnotationConfigA…

    Java 2023年6月5日
    071
  • Android开发资料超级给力小游戏(精典美女搓搓 妄撮版)源码

    本教程虽然只是从一个实例来说明 c 语言的 _游戏_制作方法,但是你可以 自己推广到其他类型或者其他 _游戏的开发_中,也可以使用其他语言来尝试编程。严格意义上我们是先 _开发_了…

    Java 2023年5月29日
    0106
  • 编写程序,使用递归方法,实现统计项目目录下有多个java文件,共有多少行代码

    import java.io.File; import java.io.FileInputStream; /** * @author Mxhlin * @Email fuhua27…

    Java 2023年6月7日
    052
  • idea使用教程-常用快捷键

    【1】创建内容:alt+insert【2】main方法:psvm【3】输出语句:sout【4】复制行:ctrl+d【5】删除行:ctrl+y 【6】代码向上/下移动:Ctrl + …

    Java 2023年6月5日
    071
  • clash TUN模式

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月16日
    088
  • 组合总和 II

    题目介绍 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates…

    Java 2023年6月8日
    0117
  • RabbitMQ 之 HelloWorld(生产者-消费者)

    RabbitMQ 之 HelloWorld(生产者-消费者) 安装rabbitmq环境 见上一篇文章rabbitmq安装 pom.xml 4.0.0 com.atguigu.rab…

    Java 2023年6月9日
    066
  • Spring(十三):设计模式——代理模式

    Spring中AOP的底层原理就是动态代理模式,所以我们在这里对代理模式进行学习。 一、代理模式 1.什么是代理 代理,顾名思义,就是一个人代替另一个人去做他需要做的事情。代理是一…

    Java 2023年6月15日
    065
  • 浅谈Java之属性赋值的先后顺序

    首先,什么是属性?属性也叫作成员变量,是类的组成部分之一。我们都知道Java一个类可以包含有: 属性,或者成员变量构造器方法,或者叫函数代码块,或者叫程序段内部类 那么结合这些,我…

    Java 2023年6月7日
    070
  • 工程师什么时机最合适选择跳槽?

    先聊一下跳槽这个事。在 Java 工程师的职业生涯中,跳槽几乎是我们每一位工程师都会经历的事情。但在面试前需要考虑清楚:现在到底应不应该跳槽? class Resume { pub…

    Java 2023年6月13日
    068
  • 关于Java数据结构转储(本文适合初学者)

    有时候想往mysql 或者 redis数据库存点数据结构。尤其是redis,尽量把大块数据打包存起来,减少set 和 get数据次数。再说远点,对分布式数据同步也是有很大的好处。 …

    Java 2023年6月14日
    072
  • 全能成熟稳定开源分布式存储Ceph破冰之旅-上

    @ 概述 定义 传统存储方式及问题 优势 生产遇到问题 架构 总体架构 组成部分 CRUSH算法 数据读写过程 CLUSTER MAP 部署 部署建议 部署版本 部署方式 Ceph…

    Java 2023年6月5日
    0126
  • MYSQL/Oracle中常用函数总结

    记录在日常工作或者学习中中使用到的函数,以下是做一个备忘~ MySQL: 窗口函数: 原文地址:https://zhuanlan.zhihu.com/p/92654574 1、窗口…

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