针对在项目中碰到的一些容错设计问题,团队最近进行了一次技术沙龙,讨论了以下话题。为什么需要应用层的容错设计?一个完整的系统在内部是由很多小服务构成,服务之间以及服务与资源之间会存在远程调用。每个系统的可用性不可能达到100%各种网络及硬件问题,如网络拥堵、网络中断、硬件故障&am ...
针对在项目中碰到的一些容错设计问题,团队最近进行了一次技术沙龙,讨论了以下话题。
为什么需要应用层的容错设计?
一个完整的系统在内部是由很多小服务构成,服务之间以及服务与资源之间会存在远程调用。
服务器平均响应速度如果慢下来,慢慢消耗掉系统所有资源,进而导致整个系统不可用。因此在分布式系统中,除了远程服务本身需要有容错设计之外,在应用层的远程调用的环节,需要有良好的容错设计。
应用层的容错设计有哪些方法?以下是微博团队使用过的一些实践。
访问MySQL的容错设计
访问Memcached/Redis的容错设计
首先设置so_timeout,避免无限制等待;服务器连接如果IO异常,设置错误标志,一段时间停止访问;出错后定期主动(比如ping Redis)或被动(当被再次访问时)探测服务是否恢复。
Failover机制:
Finagle的FailFast模块会避免分发请求到出现问题的服务,它通过来记录到每个host的错误来进行标记,当出错以后,Finagle会通过一个后台get='_blank'>线程定期重连以检查是否恢复。当host宕机时,相关的service会标记成不可用。
如果来redisign一个通用的网络client,它应该包括哪些元素?
具有服务的分层设计,借鉴Future/Service/Filter概念
具有网络的分层设计,区分协议层、数据层、传输层、连接层
独立的可适配的codec层,可以灵活增加HTTP,Memcache,Redis,MySQL/JDBC,Thrift等协议的支持。
将多年各种远程调用High availability的经验融入在实现中,如负载均衡,failover,多副本策略,开关降级等。
通用的远程调用实现,采用async方式来减少业务服务的开销,并通过future分离远程调用与数据流程的关注。
具有状态查看及统计功能
当然,最终要的是,具备以下通用的远程容错处理能力,超时、重试、负载均衡、failover……
觉得文章有用?立即: 和朋友一起
共学习 共进步!
原标题:应用层的容错与分层设计
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。