专栏首页陶士涵的菜地[项目] 企业邮箱读信接口的缓存改造过程

[项目] 企业邮箱读信接口的缓存改造过程

邮箱中最重要的一个功能就是读取一封信 , 也是使用的最多的接口 , 对此接口的读取效率是有一定要求的.

1. 最早的邮箱架构邮件还是存放在本地的共享文件目录下 , 每次读取邮件 ,就是在本地寻找到这个文件本体 ,然后把文件内容返回来就可以了.

2. 随着邮件越来越多 ,在本地遍历邮件目录和文件列表变的十分缓慢 , 于是就把本地文件 , 迁移到了公司内部的分布式文件系统s3 , 邮件的索引信息元信息存储在数据库分库分表中 , 拆分出索引服务的tcp接口 , 前端通过索引接口找到路径信息 , 通过路径信息拼接好http协议 , 调用http接口去下载文件 .

3. 在调用s3的时候 , 不能每次打开一个邮件 , 都去调用s3吧 . 所以在本地再次创建了共享目录 , 作为缓存目录 , 第一次读取的时候是去s3下载 , 保存到缓存目录 , 之后就直接读取缓存目录就可以了

4. 邮件服务会有这么几个对外的端 , web , pop , imap , 三个端 . 现在三个端是各自自己缓存的邮件 , 不能共享. 为了再次提升效率 , 就通过nginx代理部署了专门的缓存服务器 , 三个端都直接去缓存服务器下载文件 , 缓存服务器再去拉取s3的文件 ,并且缓存下来 , 这样三个端都能共享一份缓存了.

5.公司内部的s3服务并不是特别稳定 , 因此部门又引入了阿里云存储 , 在收信的时候会同时往s3和阿里云写两份文件 , 在索引服务中增加标识 , 标识出属于s3还是阿里云, 还是两边都有. 各端通过标识 , 优先去阿里云拉取邮件 , 因为阿里云和s3存储文件的路径不一致 , 因此就废弃了nginx的代理缓存 .

6.我负责的web和移动客户端, 其他端不知道 , 每次都前往阿里云拉取邮件 , 因为是走的阿里云内网 , 不会占用流量 ,速度也很快 ,为了项目的可维护性 ,迁移服务器时,不需要考虑各种缓存目录的权限问题 , 就去掉了所有缓存 , 直接访问阿里云存储.

7.现在接口中最大的性能问题是在解信的过程中 , 需要逐行读取和拆分 , 封装成对象 , 比较慢 , 应该是需要升级PHP来改造这一过程.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [PHP] 广度优先搜索匹配网站所有链接

    陶士涵
  • [视频教程] 使用composer安装使用thinkphp6.0框架

    安装composer -vvv的参数是表示展示安装进度,测试时使用其他参数安装失败,一直卡着不动 curl -vvv https://getcomposer.o...

    陶士涵
  • [PHP] 算法-选择排序的PHP实现

    陶士涵
  • java直接读取.zip压缩文件ZipEntry.getsize()总是返回-1?

    但是后面发现一个问题,读取的时候总是返回-1 ze.getSize()的值总是-1,可是名字都到了。 找不到法子,着实无奈,后面换了种方式,干脆将文件解压出来之...

    软测小生
  • 栈(Stack) 原

    栈又称堆栈,是限制在表的一端进行插入和删除运算的线性表。 表中进行插入、删除操作的一端称为栈顶(top)。 栈顶保存的元素称为栈顶元素。 表的另一端称为栈...

    云飞扬
  • 你了解这些常用的分析方法论么?(备忘&分享)

    SWOT分析法,即态势分析,可以用来分析我们这一年的优势、劣势、存在什么样的机会和挑战,让我们能更好的来规划新的一年。

    xjjdog
  • 多重继承重名方法调用顺序

    skylark
  • 蓝桥杯-2019第十届蓝桥杯B组C++年号字串

    小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。对于27 以上的数字,小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对 应28,A...

    Debug客栈
  • MySql-Binlog协议详解-报文篇

    #MySql-Binlog协议详解-报文篇 紧接上篇流程篇,本篇主要将binlog的event报文。 ##Event报文分层 event报文主要分三层。 (1...

    无毁的湖光-Al
  • 基于HT for Web矢量实现HTML5文件上传进度条

    HT_hightopo

扫码关注云+社区

领取腾讯云代金券