你的位置:首页 > 软件开发 > ASP.net > 应用层的容错与分层设计

应用层的容错与分层设计

发布时间:2016-01-07 23:00:24
针对在项目中碰到的一些容错设计问题,团队最近进行了一次技术沙龙,讨论了以下话题。为什么需要应用层的容错设计?一个完整的系统在内部是由很多小服务构成,服务之间以及服务与资源之间会存在远程调用。每个系统的可用性不可能达到100%各种网络及硬件问题,如网络拥堵、网络中断、硬件故障&am ...

针对在项目中碰到的一些容错设计问题,团队最近进行了一次技术沙龙,讨论了以下话题。

为什么需要应用层的容错设计?

一个完整的系统在内部是由很多小服务构成,服务之间以及服务与资源之间会存在远程调用。

  • 每个系统的可用性不可能达到100%

  • 各种网络及硬件问题,如网络拥堵、网络中断、硬件故障……

  • 远程服务平均响应速度变慢

服务器平均响应速度如果慢下来,慢慢消耗掉系统所有资源,进而导致整个系统不可用。因此在分布式系统中,除了远程服务本身需要有容错设计之外,在应用层的远程调用的环节,需要有良好的容错设计。

应用层的容错设计有哪些方法?以下是微博团队使用过的一些实践。

访问MySQL的容错设计

  • 写操作:如果master异常,直接抛异常。

  • 读操作:如果slave有多个,先选择其中一个slave,如果获取连接失败,再选择其他的slave,如果全部不可用,最后选择master。

访问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 (#换成@)。

可能感兴趣文章

我的浏览记录