很多答题教程都会提到要计算数据量,很多人会问,真的要计算得那么细吗?如果是在工作中做design,当然要计算得那么细,特别是会影响你对于long term scalability和cost上的考量。如果是面试,根据我目前的经验来看搞明白量级就差不多了,比如究竟是TB还是GB、百万级还是千级QPS,来决定合理的处理手段(in-memory vs database, SQL vs NoSQL, CAP strategy etc)。当然如果你在面senior以上的面试,随手就能算出精确的数字甚至给出infra的具体选择和cost analysis,这会是加分项。
Rate limiter https://www.youtube.com/watch?v=FU4WlwfS3G0
东欧大哥给的一个经典案例,面试按这个答没有问题。Schema上不需要做过多的设计,你就简单存几个数字和identity就行了。但这里例子欠缺的部分是,design is not a one-way door,并不是你用了distributed就不能用local rate limiter来做safeguard,在保证availability方面可以考虑得再深一点。同时mesh结构的distributed throttling会不会有N^2的问题,过几年会不会对CPU使用率造成影响?如果我要基于CPU或者memory进行rate limit怎么做?这些都是可以进一步思考的问题。
尝试回答一下,这题我面试遇见过4 - 5次了。一般都是结合top k most hit endpoints/top k products from N endpoints/products。总结下来就是QPS会很大,但是总数N不会很多,内存可以轻松存下来。
top k 问题一般的考点就是real time rough estimate vs offline accurate result。
计算精确值的时候可以用HDFS或者Cassandra存每小时或者每天的数据,一个定时的map reduce job来根据需求计算这段时间内的top k(可以细化到秒)。长期的metadata可以直接删除也可以migrate到成本更低的S3里面。统计的top k result根据需求可以丢不同的数据库里。这里常问的点就是ingest这么多数据的时候如何来避免写过热。
Real time具体看QPS的大小,标准解法就是每个service直接把需要统计的项丢一个Kafka topic里面用Kafka来decouple ingest, 然后real time Kafka + Flink来统计每秒top k。但是要是QPS太大比如1M左右,其实real time也可以用batch来做in memory batch update的,每个server用in memory的hashmap来存key和counts,每200ms 提交一次in memory的这个result到 Redis里面然后另外每秒对Redis做real time Top K计算。我一般都会把这两种解法抛出来然后讨论下trade off。如果有需求做real time + historical top K 的话 real time计算出来的结果不能删除得和之前的甚至long term的结果结合起来做一个联合的top K。