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

写在前面

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

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

(0)

大家都在看

  • 服务管理与通信,基础原理分析

    涉及轻微的源码展示,可放心参考; 一、基础简介 服务注册发现是微服务架构中最基础的能力,下面将从源码层面分析实现逻辑和原理,在这之前要先来看下依赖工程的基础结构,涉及如下几个核心组…

    Linux 2023年6月14日
    0139
  • 总结:弹性伸缩的五个条件与六个教训

    前言弹性伸缩是云计算时代给我们带来的一项核心技术红利,但是 IT 的世界中,没有一个系统功能可以不假思索的应用到所有的场景中。这篇文章,我们将应用企业级分布式应用服务-EDAS 的…

    Linux 2023年6月8日
    0100
  • centos7 安装MariaDB 10.6

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 背景 centos7使用yum install mariadb-server命令安装的默认版本是5.5的,这是因为系统默认源只有…

    Linux 2023年5月27日
    0371
  • Linux文件属性详述

    一、文件属性信息概述 文件属性信息组成如下: 文件索引属性信息——inode编号; 文件类型权限信息; 文件链接属性信息——硬链接数; 文件属主信息——文件所有者; 文件属组属性信…

    Linux 2023年5月27日
    0101
  • apache tomcat 目录session应用信息漏洞

    Tomcat 是一款开源的 Web 应用服务器软件。Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发和调试 JSP 程序的首选。 漏洞描…

    Linux 2023年6月7日
    0136
  • 搭建openvpn连接公司内网

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

    Linux 2023年6月7日
    0119
  • 进程间通信(IPC)

    进程间通信(Interprocess Communication,IPC)是指两个或者多个进程之间进行数据交换的过程 进程拥有独立的内存空间 命令行参数(向子进程传递和exec系列…

    Linux 2023年6月6日
    0118
  • bash获取机器IP后缀

    1.先获取部分数据 ip_0=ip a | grep inet | grep -v inet6 | grep ens | awk ‘NR==1{print $2}’ | cut -…

    Linux 2023年6月7日
    092
  • Linux常用命令

    基本操作 创建目录: mkdir xxx 删除目录: rm -rf xxx 切换目录: cd xxx,返回: cd – 创建文件: touch xxx.txt 复制文件: cp x…

    Linux 2023年6月8日
    0120
  • Redis的Docker安装及基本使用

    Redis 端口 6379 通过以下命令启动一个简单的Redis容器 docker run –name some-redis -d -p 6379:6379 redis:6.2….

    Linux 2023年5月28日
    089
  • Shell Step by Step (4) —— Cron & Echo

    6.脚本定时任务 <span class="hljs-preprocessor"># Example of job definition:</…

    Linux 2023年5月28日
    0135
  • 软件工程 结构法方法 第2篇随笔

    建立系统的功能模型图 首先:建立系统环境图,确定系统边界 其中: 数据流为:销售的商品,日销售额等;三个输入流,三个输出流 ​ 数据源为:营业员,经理,收款员 ​ 数据潭为:经理,…

    Linux 2023年6月7日
    0101
  • 【论文笔记】Towards Certifying l-infinity robustness using neural networks with l-infinity-dist neurons

    原文地址 slides GitHub 代码 本文发表于 2021 ICML,提出了一个新颖的神经网络计算方式:对于网络中的每个神经元,不采用传统的线性转换+非线性激活函数的方式,而…

    Linux 2023年6月7日
    081
  • 如何配置静态路由

    1.主机A想要和主机B 进行通讯,首先会发送一个ARP的广播。 2.第一次封装包含:源IP(192.168.1.2)目的IP(192.168.2.2);源Mac(11-11)目的M…

    Linux 2023年6月6日
    0108
  • Tomcat启动乱码

    1、找到安装的tomcat的conf目录2、找到logging.properties配置文件3、在文件中找到 java.util.logging.ConsoleHandler.en…

    Linux 2023年6月7日
    0106
  • sublime 3同步编辑线上代码

    1.打开编辑器输入框(Ctrl+Shift+P),并执行 2.回车后输入sftp 3.回车,安装,等待 4.右键项目 5.修改配置信息,保存 Original: https://w…

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