赞
踩
在系统设计的时候,可以依据于墨菲定律
在系统划分的时候,可以依据康威定律
幂等性对大多数同志来说是容易忽视的问题,但无论是单体还是微服务都会考虑这个问题,相对而言微服务项目在项目运行中是非常需要关注的问题。在项目中如服务与服务之间的消息通讯,目标服务没有及时处理或者返回,调用方服务可能会采取重试机制,此时可能就会造成服务端对同一个任务处理两次的情况,顾需要考虑幂等性的设计防止这种情况的产生。
如果服务存在状态对整个系统而言就会降低扩展,如果服务无状态,那么应用比较容易进行水平扩容。实际生成环境中可能是应用无状态,配置文件是有状态的,那么我们就可以考虑通过配置中心指定。
消息队列在项目中多以处理耗时任务、异步任务为主,但也可以用于流量削峰/缓冲等。但在使用消息队列的时候需要考虑生产消息失败,以及消息重复接收的场景。目前的一些消息队列机制如rabbitmq
、kafka
等都有相关的应对方案。但在设计的时候对系统来说如果不能容忍失败的时候,一定要做好数据的后续处理,比如将数据持久化,设置警告。
在使用了消息队列的情况下还可能存在数据丢失的情况,因此需要考虑对数据进行校验来保证数据的一致性和完整性。可以通过worker
定期检查对应日志,对数据校验,如果存在问题进行补尝。
此项主要应用在高并发的场景,比如以课程详情为例,它所要展示的课程详情信息需要从多个服务中获取,然后再汇总返回给用户。
如果每次都是从多个服务中获取,这样读性能会降低。此时我们可以将课程所需要的数据进行异构到课程服务中,然后对相关的数据进行聚合存储,形成数据的闭环,
数据异构:通过mq
机制接收数据的变更,然后序列化存储到合适的存储引擎中
数据聚合:把多个服务的数据源拿过来,提前就根据业务组装好数据结构存储到kv
存储中
前端展示:前端通过一次或少量调用就可以获取到所有需要的数据。
如下示例:可以基于cannal
监听各个服务mysql
的binlog
日志,然后通过worker
同步并聚合到mongodb
中,用户获取课程信息就可以从mongodb
中获取到数据。
在系统中:我们可以根据服务的数据情况,在各个层级之间合理设置缓存。节点有:客户端→客户端网络→CDN→接入层→应用层→分布式缓存
客户端如果为APP则可以将一些素材缓存到客户端里,而浏览器则可以缓存一些实时不高的数据,如评价、广告词、logo等。
在接入层往往应用的是nginx
,我们可以设置nginx
的代理缓存来实现。
对应用层和分布式缓存而言主要缓存具有变化性的,并且要是实时较高并访问频率高的数据。
在运用缓存的时候需考虑缓存的更新时间点。
假设我们有如下数据
目标数据 数据A 数据B 数据C 数据D 数据E
获取时间 20ms 10ms 30ms 5ms 15ms
依赖关系 无 依赖A 无 依赖A、B 无
如果程序串联执行则需要80ms。
如果我们并发化获取,则需要35ms,能提升一倍的性能。
限流的目的是防止恶意请求流量、恶意攻击,或者防止流量超出峰值。
nginx
的limit
模块,或者自己在应用层采用的限流算法处理如:令牌桶算法ip
可以用nginx
的deny
进行处理。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。