高可用:负载增大时,系统仍然能在正常时间范围内响应请求(包括快速失败)。
实现高可用的常用方法
1、超时机制
在应用中尽量设置超时时间,eg. 连接超时、服务调用超时,避免服务器故障、线程死锁等原因造成程序一直阻塞。
2、异步调用服务
如果在服务中同步调用其它服务,下游服务故障时,上游服务也会受到影响,可通过消息队列等方式异步调用服务,消息队列实现了服务间的解耦,下游服务故障时,上游服务不受影响。
3、服务限流、降级
可在网关层、服务层使用guava、hystrix等框架对服务进行限流、降级
4、幂等性设计
在高并发时,常常会出现延时响应,从而造成消息的重复消费、服务的重复调用,这时候需要考虑幂等性,get、put、delete都是幂等的,不用考虑;post(新建)不是幂等的,需要实现幂等性。
5、数据备份
数据备份用于保证数据的可用性,备份可分为热备、冷备,冷备是把数据备份到硬盘等存储介质中,冷备的特点是简单但数据恢复慢。
6、失效转移
失效转移:集群中的某个节点故障时,对此节点的所有读写操作都要改路由到集群中的其它的节点。失效转移的3个步骤:失效确认、访问转移、数据恢复。常见的比如nginx代理tomcat,zk集群,redis的主从节点。
7、分级部署
将服务划分优先级,eg. 订单服务、支付服务的优先级高于评价服务,高优先级的服务、应用部署到性能更好的机器上。
低优先级的服务可以通过部署在不同的虚拟机上进行隔离,高优先级的服务尽量部署到不同物理机上进行隔离,核心服务应该部署到不同地域的数据中心上。