产品开发经验分享6——创作灵感2

162 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

最近对创作灵感的功能进行了迭代升级,主要有以下功能变化

  • 所有热点都展示视频
  • 联动必剪素材
  • 增加主题分类
  • 增加稿件feed流功能

因此需要对之前的功能进行一系列的迭代升级,我这里总结一些日常开发中可以借鉴的地方。

使用4s的方法进行分析。关于系统设计的方法,可参考:《系统设计面试指北》

Scenario 场景

本次多了非常多的外部依赖,针对不同的外部依赖,需要采用不同的做法。

  1. 对于更新频率要求较高的数据源

有些外部数据,如果每次都实时查的话,大概有几百的QPS,不光意义不大,同时也会给对方服务带来比较大的压力。

因此,可以考虑在我们服务里走一层缓存。缓存比较常见的有两种,一种是local cache,一种是redis缓存。

local cache直接存储在内存中,不需要引入额外的外部依赖,如果所有用户访问的数据都是同一份的话,可以考虑存储在local cache里。

具体的实现逻辑是:服务刚启动的时候,先加载一遍local cache,然后启动异步的定时任务,比如每10s一次,去更新缓存。

  1. 对于更新频率要求不高的数据源

有的数据,如果要求的是t+1更新,我们可以使用定时任务的方式。

有些优秀的分布式调度工具,比如celery,xxl-job,可以帮助我们去做定时任务的调度。每天执行一次任务即可,数据可存储在MySQL中。

Service 服务

在我们本次的设计中,同时做了微服务的拆分。

我们把提出了一个叫做聚合网关的概念,原来的服务,只会聚合各个微服务的数据进行展示,可以接触对原来数据库的依赖。

微服务拆分后,有常规的三块内容,接口、后台管理、任务。

同时,对于原服务的老接口,我们要么把它重定向到新服务上,要么在新服务上提供rpc接口,供原服务读取数据。

Storage 存储

本次的存储也比较常规,MySQL+Redis即可满足需求。MySQL是存储一些业务数据,而Redis存储一些关键的key,以及去做分布式锁。

Scale 扩展

因为这次引入了定期刷新缓存的机制,运营配置完后,无法立刻看到效果,引起了他们的不满。

因此除了定期刷新缓存之外,额外设计了一种版本号管理的方式。

即在admin后台的操作,会以当前时间戳为值,在redis中记录一下版本号,实例在运行过程中,也会内部维护一个版本号,如果当检查到当前版本号,比redis的版本号要小,则触发一次主动更新。

这样主动更新+轮询更新的方式,可以有效保证缓存为最新。

当然,还可以考虑用消息队列广播的形式,不过这个我没有试过,理论上是可行的。