高可用的服务

  可复用的服务模块为业务产品提供基础公共服务,大型网站中这些服务通常都独立分布式部署,被具体应用远程调用。可复用的服务和应用一样,也是无状态的服务,因为可以使用类似负载均衡的失效转移策略实现高可用的服务。

1. 分级管理

  运维上将服务器进行分级管理,核心应用和服务优先使用更好的硬件,在运维响应速度上也格外迅速。显然,用户及时付款购物比能不能评价商品更重要,所以订单、支付服务比评价服务有更高优先级。

  同时在服务部署也进行必要的隔离,避免故障的连锁反应。低优先级的服务通过启动不同的线程或者部署在不同的虚拟机上进行隔离,而高优先级的服务则需要部署在不同的物理机上,核心服务和数据甚至需要部署在不同地域的数据中心。

2. 超时设置

  由于服务端宕机、线程死锁等原因,可能导致应用程序对服务端的调用失去响应,进而导致用户请求长时间得不到响应,同时还占用应用程序资源,不利于及时将访问请求转移到正常的服务器。

  在应用程序中设置服务调用超时时间,一旦超时,通信框架就抛出异常,应用程序根据服务调度策略,可选择重试或将请求转移到相同服务的其他服务器上。

3. 异步调用

  应用服务的调用通过消息队列等异步方式完成,避免一个服务的失败导致整个应用请求失败的情况。

4. 服务降级

  在网站访问高峰期,服务可能因为大量的并发调用而性能下降,严重时可能导致服务宕机。为了保障核心应用和功能的正常运行,需要对服务降级。降级的手段有两种:拒绝服务及关闭服务。

  拒绝服务:拒绝低优先级应用的调用,减少服务调用并发数,确保核心应用正常使用;或者随机拒绝部分请求调用、节约资源。

  关闭功能:关闭不重要的服务,或者服务内部关闭部分不重要的功能。

5. 幂等性设计

  应用调用服务失败后,会调用请求重新发送到其他服务器,但是这个失败可能是虚假的失败。比如服务已经处理成功,但因为网络故障应用没有收到响应,这时应用重新提交请求就导致服务重复调用,如果这个服务是一个转账操作,就会产生严重后果。

  服务重复调用是无法避免的,应用层也不需要关心服务是否真的失败,只要没有收到调用成功的响应,就可以认为调用失败,并重试调用。因此必须在服务层保证服务重复调用和调用一次产生的结果相同,即服务具有幂等性。

  有些服务天然具有幂等性,比如将用户设置为男性,不管设置多少次,结果都一样。但是对于转账交易等操作,问题就会比较复杂,需要通过交易编号等信息进行服务调用有效校验,只有有效的操作才能继续执行。

 

posted @ 2020-12-08 16:32  曹丽是我女朋友。  阅读(120)  评论(0编辑  收藏  举报