大型网站技术架构,5网站的高可用架构之高可用的服务
5.4 高可用的服务
可复用的服务模块为业务产品提供基础公共服务,大型网站中这些服务通常都独立分布式部署,被具体应用远程调用。
可复用的服务和应用一样,也是无状态的服务,因此可以使用类似负载均衡的失效转移策略实现高可用的服务。
除此之外,具体实践中,还有以下几点高可用的服务策略。
1、分级管理
运维上,将服务器进行分级管理,核心应用和服务优先使用更好的硬件,在运维响应速度上也格外迅速。显然,用户及时付款购物比不能评价商品更重要,所以订单、支付服务比评价服务有更高优先级。
服务部署上进行必要的隔离,避免故障的连锁反应。
低优先级的服务通过启动不同的线程或者部署在不同的虚拟机上进行隔离,
而高优先级的服务则需要部署在不同的物理机上,核心服务和数据甚至需要部署在不同的数据中心。
2、超时设置
由于服务端宕机、线程死锁等原因,可能导致应用程序对服务端的调用失去响应,进而导致用户请求长时间得不到响应,同时还占用应用程序的资源,不利于及时将访问请求转移到正常的服务器上。
在应用程序中设置服务调用的超时时间,一旦超时,通信框架就抛出异常,应用程序根据服务调度策略,可选择继续重试或将请求转移到提供相同服务的其他服务器上。
3、异步调用
应用对服务的调用通过消息队列等异步方式完成,避免一个服务失败导致整个应用请求失败的情况。
比如注册新用户,应用需调用三个服务:讲用户信息写入数据库,发送账号注册成功邮件,开发对应权限。
如果采用同步调用,当邮件队列阻塞不能发送邮件时,会导致其他两个服务也无法执行,最终导致用户注册失败。
如果采用异步调用,应用程序将用户注册信息发送给消息队列服务器后立即返回用户注册成功响应。
而记录用户注册信息到数据库、发送用户注册成功邮件、调用用户服务开通权限这三个服务作为消息的消费者任务,分别从消息队列获取用户注册信息异步执行。
即使邮件服务队列阻塞,邮件不能发送成功,也不会影响其他服务的执行,用户注册操作可顺利完成,只是晚一点收到注册成功的邮件而已。
当然不是所有服务调用都可以异步调用,对于获取用户信息这类调用,采用异步方式会延长响应时间,得不偿失。
对于那些必须确认服务调用成功才能继续下一步操作的应用也不适合使用异步调用。
4、服务降级
在网站访问高峰期,服务可能因为大量的并发调用而性能下降,严重时可能会导致服务宕机。
为了保证核心应用和功能的正常运行,需要对服务进行降级。
降级有两种手段:拒绝服务及关闭服务。
拒绝服务:
拒绝低优先级应用的调用,减少服务调用并发数,确保核心应用正常使用;
或者随机拒绝部分请求调用,节约资源,让另一部分请求得以成功,避免要死大家一起死的惨剧。
关闭服务:
关闭部分不重要的服务,或者服务内部关闭部分不重要的功能,以节约系统开销,为重要的服务和功能让出资源。
5、幂等性设计
应用调用服务失败后,会将调用请求重新发送到其他服务器,但是这个失败可能时虚假的失败。
比如服务已经处理成功,但因为网络故障应用没有收到响应,这时应用重新提交请求就导致服务重复调用,如果这个服务时一个转账操作,就会产生严重后果。
服务重复调用无法避免,应用层不需要关心服务是否真的失败,服务层要保证服务重复调用和调用一次产生的结果相同,及服务具有幂等性。
有些服务天然幂等,比如将用户性别设置为男性,不管设置多少次,结果都一样。
但是对于转账交易等操作,问题就会比较复杂,需要通过交易编号等信息进行服务调用有效性校验,只有有效的操作才能继续执行。
作者: 元宝爸爸
出处:https://www.cnblogs.com/wozixiaoyao/p/11965398.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。
觉得文章不错,点个关注呗!