美文网首页
GeekBand C++ Week12 Notes

GeekBand C++ Week12 Notes

作者: 古来征战几人回 | 来源:发表于2016-08-02 01:09 被阅读0次

    系统设计与实践

    系统设计介绍

    短URL设计

    设计一个系统把用户提供的URL转换为短的URL,访问的时候要跳回到原始的URL,在系统设计的面试里,如何评价一个系统设计,一分到四分

    第一级:

    设计一个数据库来映射关系,从短URL到原始的URL。

    有哪些不好的地方?

    从原始的URL返回一个5位的编码,不是五位的用0补充。

    能不能扩充,返回的ID为什么都是0到9?

    在Cache里面搜索,Read/Write rate LRU和LFU

    第二级:

    Key-Value DB

    MySQL is slow

    Key-Value模型做了很多简化,提升了性能,是MySQL的10倍以上

    有没有其他办法产生呢?

    URL->md5(128bits)

    Base64->6bits

    Truncate(md5(URL), 5)

    第三级:

    考虑到扩展性和可靠性

    Multiple Servers(Memcache/DB)

    Sharding: hash(URL) % N = Server ID

    Standby

    Reliability

    Replica(cross region, master slave)

    Recovery(master: checkpoints, slave:recreate)

    Consistency:一致性,在分布式当中,某一个节点还没有同步完成,从A和B中读出来有误差

    第四级:

    从chunk中分到一个cluster,id generator(zookeeper)

    怎么避免URL被重复地访问和爬虫(有些网站不想要被爬取),可以在内部把字符串打乱

    怎么限制单一用户RPS,strategy?

    流量控制

    怎么实现重定向的思路?

    速率限制:可以用memcache,key是IP,Username/Email, UserId(logged in)

    Reak key in memcache: key+timestamp(inminute)

    Value:counter

    Expiration:/m,/h,/d

    Memcache内存

    Redis内存+磁盘,定时从内存flush

    Nosqul database

    Sql database

    Ratelimit

    使用cache带上过期销毁信息,一个小时后销毁,但算法会出错

    系统设计七剑客:

    同步

    网络

    数据库

    分布式

    性能

    估算

    面向对象

    案例-社交网络信息流

    日志统计

    网络爬虫

    电商产品页面

    concurrency

    thread vs. process

    consumer and producer

    blockingqueue

    tracking:

    synchronized, asynchronized

    操作系统里面程序运行的系统单位,一个程序至少有一个进程,一个进程至少有一个线程,进程的划分比较小,一个进程有独立的内存单位,但多个线程可以共享内存,每一个独立的线程有入口,序列和程序的出口,操作系统会用进程的调度管理来分配,进程是数据集合上的活动,是系统实现调度的单位

    生产者和消费者:

    有限的缓冲问题,多线程同步问题的案例,主要描述了两个共享缓冲区的线程,一个叫consumer,一个叫producer,生产者生产一定数据到缓冲区,消费者负责消费,生产者不会在缓冲区满的时候加入,消费者不会在空的时候的消费

    blockingqueue

    给定了一个queue的结构,普通的queue先入先出,但空的时候要等待,满的时候不能push,queue的基本操作,有move和add,有maxSize,,如果有两个同时去操作的话,有保护,在函数起始位置有lock,末尾有unlock.当queue是空的时候,que就一直在等待,

    tracking相关的,记录一个事件是不是被记录下来,

    两种做法一种是同步的,一种是异步的,当你去访问一个服务的时候是一个get请求,异步的方式,放入缓冲区,做一种积累,log aggregator,每隔一段时间去刷新到磁盘上面,好处是一方面降低系统复杂度,另一方面可以加一些实时的分析系统。

    网络结构

    OSI

    Application layer

    Presentation layer

    Session layer

    Transport layer

    Networklayer

    Data link layer

    Physical layer

    在头部会加一些mate data

    应用层有HTTP协议,1.1

    传输层:TCP,UDP

    网络层IP

    TCP是一个可靠的稳定的链接,UDP不太可靠,到物理层会通过路由传输到另外一台机子上去,然后会一层层往上解压

    Visit URL

    当你输入一个URL后发生了哪些事情

    先要链接到远端的服务器,然后发送请求到服务器,寻址和建立链接,首先你要做一个寻址,如果浏览器中存在URL的IP,就直接访问,否则要访问DNS,寻址加上域名找到IP,域名是一个分层的结果,顶级域名,DNS会返回服务器的地址,第三步就是浏览器会建立三次握手建立TCP的链接,网页服务默认端口是80端口,第四部是浏览器和服务器的会话,接受数据,第五步是浏览器解析数据并渲染展示网页,浏览器关闭的时候会终止对话并把链接关闭。

    数据库Database

    relational DB vs. Key value store

    sharding vs. clustering

    以前关联是主流,结构化和数据模型,交易的安全性要求非常高

    KV store在很多社交网站,发了很多信息是对象的存储,是一个静态的过程,不需要做很多关联。

    分片和集群的比较,一台数据库的容量有限,单个表的承受在一千万左右,超过一千万实现的性能比较差,需要拿到更大的数据量需要拆表,垂直拆和水平拆,取摸然后分配到不同的机器上面去,第二种是clustering,是一个自动管理的东西,会自动维护,有协调者,知道哪个服务器的复杂量的高低,每次先访问协调者,然后返回一个服务器地址。

    听起来很好,加一台数据库会告诉你,在真正的工业中sharding更多一点,算法设计不好的话本来负荷就很高,给更多的压力,一旦发现问题的话sharding能做问题的定位和处理,在做tinyURL的时候也用到了数据库的结构,怎么拿到code,url, created_at,要加一个索引。

    分布式

    怎么规模化tinyurl,一个是对于前段的服务可以用load balancer,给前端服务做均衡,当某一台机器做了一个转移之后还能做

    第二个是把服务器sharding化。

    第三步提高性能,每一层都可以加一些cache,相当于把读的请求给缓存住,大大减轻服务器的压力。

    然后对写的流量也要给做一个平衡化。

    原来只能写到集中一台的对象,现在能写到某一个服务器上的数据库。

    如何做一个tracking可以在本地做一个缓冲,异步刷新到message queue上去。

    Performance性能

    Numbers evetyone should know

    访问效率,cache 0.5ns

    硬盘千万纳秒级

    闪存,寿命比磁盘小一些,比较适合做随机,磁盘适合做顺序

    Estimation

    全世界范围内有多少调音师

    tinyURL总的存储大小

    URL长度10-1000字符

    设计模式

    MVC,网络系统中,后端数据叫模型层,前段叫View,中间叫Controller

    Singleton只有一个实例,能使用一些方式来初始化这个实例

    Factory

    Iterator

    Decorator

    Façade

    案例

    news feeds

    stats server

    web crawler

    amazon product page

    相关文章

      网友评论

          本文标题:GeekBand C++ Week12 Notes

          本文链接:https://www.haomeiwen.com/subject/jsdfsttx.html