MySQL炸裂!万字长文拿下分布式系统,我在字节跳动等你( 二 )


本文插图
前端发展史 1. 整页提交 特征:
浏览器请求皆为页面级请求 , 每次请求都是一次页面跳转/刷新 。
MySQL炸裂!万字长文拿下分布式系统,我在字节跳动等你
本文插图
2. 页面+ ajax 特征:
浏览器请求主要为页面级请求 , 有局部刷新使用ajax刷新 , 页面体验更好 。
MySQL炸裂!万字长文拿下分布式系统,我在字节跳动等你
本文插图
3. mvvm模式 MVVM是Model-View-ViewModel的简写 。 它本质上就是MVC 的改进版 特征:
首次请求返回页面html , 后续请求皆为restful返回json 。
前端人员将js/css/img 资源开发完毕后 打包到apache或者nginx上 , 供浏览器访问 3 浏览器 访问静态资源服务器 , 获得HTML资源 。
HTML页面JS发起·ajax·请求后台服务器 , 得到业务数据 然后进行渲染整个页面 。 跨域问题可用nginx解决 。
MySQL炸裂!万字长文拿下分布式系统,我在字节跳动等你
本文插图
架构思路及常见解决方案1、缓存(list/redis/memached) 2、横向拓展(集群负载) 3、拆分高负载服务 , 独立为一模块 4、大表数据切片( mysql分库分区分表) 5、使用搜索中间件: solr/elasticsearch 6、全局性网站搜索跟mysql指定型搜索不一样 , 只能用上面的中间件搞定 like 搜索 。7、tomcat一般在500以下为好 。8、mysql单表一般700万以内 。
MySQL炸裂!万字长文拿下分布式系统,我在字节跳动等你
本文插图
session跨域共享 cookie、session、token 形象说 ,跨域问题:
方案1:负载使用 hash(ip) 方案2:使用redis共享session 方案3: tomcat 插件实现共享 方案4: spring session 实现共享
MySQL炸裂!万字长文拿下分布式系统,我在字节跳动等你
本文插图
常见解决方案 1. 缓冲方案 Redis 的引入 。一般缓存方案
1、先到缓存中查 , 有值直接返回 2、无值(缓存穿透、击穿)则调用接口或者查库 , 并将值补入缓存区 3、缓存区数据与db中可能不一致 , 使用过期时间调节 4、若缓存区数据集中在某一短时刻失效 , 将导致大量的缓存击穿(雪崩)
永不过期方案
1、不设置过期时间 , 数据永久有效 , 避免雪崩 2、需要额外机制来实现数据的同步更新(参照数据同步)
MySQL炸裂!万字长文拿下分布式系统,我在字节跳动等你
本文插图
2. 消息中间件 Kafka , RocketMQ , RabbitMQ , ActiveMQ
1、每个应用启动时 , 主动注册队列 2、后续收/发信息 , 只管收/发队列中数据 3、队列中数据的路由策略 ,由mq管理者来配置 , 跟应用程序无关 。 类似传话筒
MySQL炸裂!万字长文拿下分布式系统,我在字节跳动等你
本文插图
3. 同步异步 同步调度:
1、调度期间 , 主调和被调线程被同时占用 。2、被调执行完成前 , 主调等待 。3、程序内部的调度 , 则为一单线程 。
异步调度:
1、主调与被调只是一次消息发送 , 信息到达即返回 。2、被调执行完成后 , 回调一次主调方 , 发送结果回来 。3、程序内部的调度 , 则回调函数是由被调线程执行 。
MySQL炸裂!万字长文拿下分布式系统,我在字节跳动等你
本文插图
4. 同步转异步 同步转异步:空间换时间 , JDK Future Task模式
MySQL炸裂!万字长文拿下分布式系统,我在字节跳动等你
本文插图


推荐阅读