- 设计出每秒并5K的一个系统,根据网上的这个题目做以下梳理,众所周知一个良好的架构需要考虑它的高可用和可伸缩,需要做服务的熔断、降级、隔离等等,如下图是一个基本示例:
- 架构设计原理:
1、路由网关-流量分发入口,不承载具体业务,简单点可以使用nginx,如果是微服务可以使用zuul等(支持请求的分发、限流、下游依赖的发现,可以结合docker实现服务下游的web服务自动伸缩),如果采用nginx完成不了下游的伸缩发现,但是基本的限流和分发可以解决
2、web服务-可以水平扩展,通过cache加速,查询手机号码号段对应的地区,对于缓存未命中的号段,直接丢入kafka队列,实时返回client端查询中的状态
3、消费微服务-完成kafka队列的消费,根据kafka topic的partition个数也可以实现水平扩展,负责把发送号段的查询请求至实时查询微服务,保存至cache
4、实时查询微服务-因为是无状态服务,根据业务负载也可以实现水平扩展,且仅负责对外部运营商的查询,根据外部供应商的接口能力,也可以通过hystrix把该服务export出的接口做限流和熔断,这样影响面就不会波及外部合作伙伴
5、缓存预热服务-为提升体验,减少发出查询请求后的刷新等待时间,在服务发布前,可以预先把一批号段通过请求实时查询微服务,并先保存起来 - 总结
如上设计:缓存读取不会形成瓶颈,队列生产不会形成瓶颈,唯一形成瓶颈的点有可能发生在外部运营商接口,因此我们会对实时查询服务做限流和熔断,所以不会压垮运营商,但是用户端的体验就糟些了,所以我们需要把缓存预热的功夫做足,改善体验。上面的设计在不同场景下需要进行微调,基本思想不会发生大的变化,把请求异步化,一天吃不成胖子,就分多天吃,就是这个意思,当然还考察了服务的隔离、降级、可伸缩的特性!
转载于:https://my.oschina.net/13426421702/blog/3038911