即时消息技术剖析与实战
袁武林
微博研发中心技术专家
立即订阅
6503 人已学习
课程目录
已完结 24 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 搞懂“实时交互”的IM技术,将会有什么新机遇?
免费
基础篇 (8讲)
01 | 架构与特性:一个完整的IM系统是怎样的?
02 | 消息收发架构:为你的App,加上实时通信功能
03 | 轮询与长连接:如何解决消息的实时到达问题?
04 | ACK机制:如何保证消息的可靠投递?
05 | 消息序号生成器:如何保证你的消息不会乱序?
06 | HttpDNS和TLS:你的消息聊天真的安全吗?
07 | 分布式锁和原子性:你看到的未读消息提醒是真的吗?
08 | 智能心跳机制:解决网络的不确定性
场景篇 (4讲)
09 | 分布式一致性:让你的消息支持多终端漫游
10 | 自动智能扩缩容:直播互动场景中峰值流量的应对
11 | 期中实战:动手写一个简易版的IM系统
12 | 服务高可用:保证核心链路稳定性的流控和熔断机制
进阶篇 (10讲)
13 | HTTP Tunnel:复杂网络下消息通道高可用设计的思考
14 | 分片上传:如何让你的图片、音视频消息发送得更快?
15 | CDN加速:如何让你的图片、视频、语音消息浏览播放不卡?
16 | APNs:聊一聊第三方系统级消息通道的事
17 | Cache:多级缓存架构在消息系统中的应用
18 | Docker容器化:说一说IM系统中模块水平扩展的实现
19 | 端到端Trace:消息收发链路的监控体系搭建
20 | 存储和并发:万人群聊系统设计中的几个难点
21 | 期末实战:为你的简约版IM系统,加上功能
22 | 答疑解惑:不同即时消息场景下架构实现上的异同
结束语 (1讲)
结束语 | 真正的高贵,不是优于别人,而是优于过去的自己
即时消息技术剖析与实战
登录|注册

17 | Cache:多级缓存架构在消息系统中的应用

袁武林 2019-10-04
你好,我是袁武林。
今天,我要带你了解的是一项在 IM 系统中相对比较通用的、使用比较高频的,而且对系统性能提升非常明显的技术:缓存。
说到缓存,你应该不陌生。相对于磁盘操作,基于内存的缓存对耗时敏感的高并发应用来说,在性能方面的提升是非常明显的。
下面是谷歌的技术奠基人杰夫·狄恩(Jeff Dean)给出的一些计算机相关的硬件指标,虽然有些数据可能由于时间太久不够准确,但大致的量级基本还是一致的。
L1 cache reference 0.5 ns
Branch mispredict 5 ns
L2 cache reference 7 ns
Mutex lock/unlock 100 ns
Main memory reference 100 ns
Compress 1K bytes with Zippy 10,000 ns
Send 2K bytes over 1 Gbps network 20,000 ns
Read 1 MB sequentially from memory 250,000 ns
Round trip within same datacenter 500,000 ns
Disk seek 10,000,000 ns
Read 1 MB sequentially from network 10,000,000 ns
Read 1 MB sequentially from disk 30,000,000 ns
Send packet CA->Netherlands->CA 150,000,000 ns
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《即时消息技术剖析与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(17)

  • 小小小丶盘子
    开线程定时访问热点数据,保证不被淘汰。

    作者回复: 也是一种思路,不过实现上可能会比较复杂。另外可以考虑把master也加入到L1缓存层中,这样能保持数据热度。

    2019-10-04
    3
  • go
    为什么把master也当作L1可以解决热度问题?难道每一次master过期也会主动把从库的对应缓存删除?

    作者回复: master加入到L1层主要是解决master的热点数据缓存得不到访问而被lru淘汰掉,如果这时L1挂了或者被下线,会穿透master对底层db产生压力。对于redis这种本身支持主从的缓存实现,master上过期了slave上也会过期,对于memcached这种本身不支持主从的缓存实现就需要人为来维护主从关系,数据也并不会从master同步到slave。

    2019-11-12
    2
  • 那时刻
    请问怎么保证local cache到cache master的数据一致性呢?毕竟local cache在分布式的服务器集群,会有同一个文档发到不同服务器local cache的情形。从图中看出,是某一个local cache负责同步数据到cache master么?或者我有什么误解?烦请指正

    作者回复: 本地缓存的一致性我课程中有讲哈,本地缓存只会从中央缓存回种,中央缓存数据有变化并不需要同步告知本地缓存。本地缓存通过短过期时间来重新从中央缓存回种。

    2019-10-06
    2
  • javaee
    对于L1解决带宽问题,感觉文中没讲太清楚。机器带宽和网卡有关系,相同配置的机器带宽一样。从库和L1如果机器数量一样,同样带宽是没问题的。也就是说L1在存储成本上有优势,带宽上没优势吧?

    作者回复: L1的容量一般比从库容量小很多,但是会冗余多组,通过这种方式来承担极热点数据的访问,带宽上由于冗余多组来随机访问,所以带宽上自然相当于扩大了,另外由于容量都很小,也比扩从库成本上要更省。

    2019-10-15
    1
  • A:春哥大魔王
    老师L1缓存具体是实现和缓存层究竟有什么区别呢?还是说技术实现上本身没有区别,只不过存储目的不同?比如L1就是为了解决热数据的

    作者回复: 技术实现上基本一样,只不过L1主要解决热数据对master slave缓存的单点压力,也可以防止master slave缓存故障导致穿透db的问题。

    2019-10-07
    1
  • yic
    老师,有两个问题请教一下:
    1. L1缓存业界一般是如何实现的?
    2. 关于课后问题的解答,老师提供的思路是:“另外可以考虑把master也加入到L1缓存层中,这样能保持数据热度“。我想问一下,如果发生了主从关系变化呢?这时如何把master加入到L1缓存层呢?

    作者回复: L1缓存一般也是和主从缓存一样,采用中央缓存如memcached或者redis,只是在hash规则上和主从缓存有区别。
    您指的主从关系变化是说节点数变化了还是主库切成从库了?如果是节点数发生了变化采用一致性hash是可以不需要干预的,如果是主从关系变化了一般需要及时调整L1的配置。

    2019-11-07
    1
  • 独酌相思解千愁
    对于思考题,将各级缓存的存活时间分级设定,L1最小,每当L1重新拉取数据时同时更新其他缓存层的相应热点数据。同时对于一段时间类使用比较频繁的数据可以按照一定规则增加其存活时间(或者权重) 不知道这样有可行性不

    作者回复: 理论上应该可以,不过L1如果承载的是热点数据,那么对于更新主从缓存就会比较频繁,带来额外压力。一种简单的方法可以把主从缓存也作为一组L1加入,这样也能保证主从缓存里的数据热度。

    2019-11-06
  • 王蒙
    举个例子,单台机器 120MB 带宽,对于 1MB 大小的文章来说,如果 QPS 到 1000 的话,至少需要 8 个实例才可以抗住。

    请问,8是怎么算的,有什么公式吗?
    8个实例是指单台物理机,上面8个虚拟机,还是一台机器上部8个相同应用?
    还有平时手机的流量是指http请求的request的请求头和body的大小吗,response的算吗?

    作者回复: QPS 1000的话整体流量就是1G,一般常见的千兆网卡单台机器单方向120MB带宽, 所以大概需要8台左右。
    这里的流量是指网卡流量,http属于应用层的,所以是包括header和body的。

    2019-11-05
  • Geek_37e993
    请教一下,L1缓存和slave以及后端存储的数据一致性如何保证呢?

    作者回复: 有数据更新的时候会同步更新L1和master,虽然多组L1会导致多次更新的问题,但对于大部分读多写少的互联网场景来说刚更新不是一个频繁的操作,所以基本可控。

    2019-10-09
    1
  • clip
    主从以及那边有点不明白。
    为什么从库节点中有全部的数据?
    某个节点有全量的数据却只有部分对象的查询分配到自己。
    我理解的如果有全量数据那就直接循环着去不同节点中取不就行了吗,也就不需要缓存分布式算法了吧。

    作者回复: 不是哈,这里是说:对于主从缓存来说,从库拥有和主库一样的数据,所以靠不停扩展多个从库来解决某几个单key热点的问题很浪费。并不是说每个主从都有全量所有的业务数据,主从里的数据是根据hash规则来分片的,是全量数据的子集。

    2019-10-08
  • Geek_e986e3
    老师 我看你说将master节点当作l1来用保证不过期。这样的话我能理解成l1实际上也就是容量缩小版的从节点吗?

    作者回复: 将master也加入到L1层主要是防止master里热数据被淘汰。L1是并列多组小容量的缓存,通过多组冗余来扛热数据,解决挡在master slave缓存前面。

    2019-10-06
  • 卫江
    思考题,我感觉可以在L1层,根据访问的特定数据的频率,比如qps超过100就去后面缓存拉一下,这样一来实现简单,频率不高又能保证热数据不被淘汰,同时也可以作为L1缓存的数据更新保证数据一致性的实现方式。

    作者回复: 嗯,这个也是一种实现方案,实现上可能会稍微麻烦一点。也可以考虑把master当做一组L1,也加入到L1层中来保证热度。

    2019-10-06
  • _CountingStars
    主从缓存层不使用lru算法淘汰数据 保存全量数据 内存不够 就使用SSD存储数据 比如 ssdb rocksdb leveldb
    2019-10-05
  • 探索无止境
    老师理论都已经清楚了,能否提供一个可落地的具体实现,比如L1缓存具体要怎么做?
    2019-10-05
  • 孙凯
    老师能详细讲下L1级缓存怎么用么?

    作者回复: 实现上并不复杂,其实就是二次哈希的过程,比如将原来哈希到slave1的请求再采用round robin轮流打到多组L1上,这样就实现流量分散了。

    2019-10-04
  • 刘丹
    请问L1缓存是指redis、memcached这种网络缓存吗?

    作者回复: 一般真实场景中来说是的,不过L1主要还是一种缓存架构,实现上没有限制的。

    2019-10-04
  • 东东🎈
    老师,hash(uid)%10和uid%10这两个有啥区别?然后L1空间很小,一般存放哪些类型的数据呢?

    作者回复: 有的uid是字符型的,所以通用做法就是先hash一下。
    L1缓存一般自动lru成最热的数据。

    2019-10-04
    1
收起评论
17
返回
顶部