`

Dubbo设计分享——实现的健壮性

阅读更多
From:http://pt.alibaba-inc.com/wp/experience_1224/robustness-of-implement.html

Dubbo作为远程服务暴露、调用和治理的解决方案,是应用运转的经络,其本身实现健壮性的重要程度是不言而喻的。

这里列出一些Dubbo用到的原则和方法。

一、日志

日志是发现问题、查看问题一个最常用的手段。

日志质量往往被忽视,没有日志使用上的明确约定。

重视Log的使用,提高Log的信息浓度。

日志过多、过于混乱,会导致有用的信息被淹没。

要有效利用这个工具要注意:

1. 严格约定WARN、ERROR级别记录的内容

·         WARN表示可以恢复的问题,无需人工介入。
·         ERROR表示需要人工介入问题。
有了这样的约定,监管系统发现日志文件的中出现ERROR字串就报警,又尽量减少了发生。

过多的报警会让人疲倦,使人对报警失去警惕性,使ERROR日志失去意义。

再辅以人工定期查看WARN级别信息,以评估系统的“亚健康”程度。

2. 日志中,尽量多的收集关键信息

哪些是关键信息呢?

·         出问题时的现场信息,即排查问题要用到的信息。如服务调用失败时,要给出 使用Dubbo的版本、服务提供者的IP、使用的是哪个注册中心;调用的是哪个服务、哪个方法等等。这些信息如果不给出,那么事后人工收集的,问题过后现场可能已经不能复原,加大排查问题的难度。
·         如果可能,给出问题的原因和解决方法。这让维护和问题解决变得简单,而不是寻求精通者(往往是实现者)的帮助。
3. 同一个或是一类问题不要重复记录多次

同一个或是一类异常日志连续出现几十遍的情况,还是常常能看到的。人眼很容易漏掉淹没在其中不一样的重要日志信息。要尽量避免这种情况。在可以预见会出现的情况,有必要加一些逻辑来避免。

如为一个问题准备一个标志,出问题后打日志后设置标志,避免重复打日志。问题恢复后清除标志。

虽然有点麻烦,但是这样做保证日志信息浓度,让监控更有效。

二、界限设置

资源是有限的,CPU、内存、IO等等。不要因为外部的请求、数据不受限的而崩溃。

1. 线程池(ExectorService)的大小和饱和策略

Server端用于处理请求的ExectorService设置上限。

ExecutorService的任务等待队列使用有限队列,避免资源耗尽。

当任务等待队列饱和时,选择一个合适的饱和策略。这样保证平滑劣化。

在Dubbo中,饱和策略是丢弃数据,等待结果也只是请求的超时。

达到饱和时,说明已经达到服务提供方的负荷上限,要在饱和策略的操作中日志记录这个问题,以发出监控警报。

记得注意不要重复多次记录哦。

(注意,缺省的饱和策略不会有这些附加的操作。)

根据警报的频率,已经决定扩容调整等等,避免系统问题被忽略。

2. 集合容量

如果确保进入集合的元素是可控的且是足够少,则可以放心使用。这是大部分的情况。

如果不能保证,则使用有有界的集合。当到达界限时,选择一个合适的丢弃策略。

三、容错-重试-恢复

高可用组件要容忍其依赖组件的失败。

1. Dubbo的服务注册中心

目前服务注册中心使用了数据库来保存服务提供者和消费者的信息;

注册中心集群不同注册中心也通过数据库来之间同步数据,以感知其它注册中心上提供者。

注册中心会内存中保证一份提供者和消费者数据,数据库不可用时,注册中心独立对外正常运转,只是拿不到其它注册中心的数据。

当数据库恢复时,重试逻辑会内存中修改的数据写回数据库,并拿到数据库中新数据。

2. 服务的消费者

服务消息者从注册中心拿到提供者列表后,会保存提供者列表到内存和磁盘文件中。

这样注册中心宕后消费者可以正常运转,甚至可以在注册中心宕机过程中重启消费者。

消费者启动时,发现注册中心不可用,会读取保存在磁盘文件中提供者列表。

重试逻辑保证注册中心恢复后,更新信息。

四、重试延迟策略

上一点的子问题。Dubbo中碰到有两个相关的场景。

1. 数据库上的活锁

注册中心会定时更新数据库一条记录的时间戳,这样集群中其它的注册中心感知它是存活。

过期注册中心和它的相关数据 会被清除。数据库正常时,这个机制运行良好。

但是数据库负荷高时,其上的每个操作都会很慢。这就出现:

·         A注册中心认为B过期,删除B的数据。
·         B发现自己的数据没有了,重新写入自己的数据。
的反复操作。这些反复的操作又加重了数据库的负荷,恶化问题。

可以使用下面逻辑

当B发现自己数据被删除时(写入失败),选择等待这段时间再重试。

重试时间可以选择指数级增长,如第一次等1分钟,第二次10分钟、第三次100分钟。

这样操作减少后,保证数据库可以冷却(Cool Down)下来。

2. Client重连注册中心

当一个注册中心停机时,其它的Client会同时接收事件,而去重连另一个注册中心。

Client数量相对比较多,会对注册中心造成冲击。

避免方法可以是Client重连时随机延时3分钟,把重连分散开。
分享到:
评论

相关推荐

    dubbo——dubbo简介1

    微内核+插件的设计理念使得Dubbo的核心组件如协议(Protocol)、传输层(Transport)、序列化(Serialization)等都可扩展。用户可以根据实际需求引入第三方实现,例如,可以选择不同的序列化方式以优化网络传输效率。 5...

    dubbo——演变架构1

    在IT行业中,架构设计是软件开发的关键环节,它决定了系统的可扩展性、稳定性和性能。本文主要探讨了四种常见的架构模式:单一应用架构、垂直应用架构、分布式服务架构以及流动计算框架,这些都是基于Dubbo等微服务...

    dubbo-admin-2.5.4-jdk7&jdk8.rar

    而本文将重点讨论的是Dubbo的服务管理工具——Dubbo Admin 2.5.4,它对于JDK7和JDK8的兼容性,为开发者提供了更多的灵活性。 Dubbo Admin是一个基于Web的管理控制台,它为Dubbo服务的监控和管理提供了友好的界面。...

    Dubbo(七)------服务运行的三种方式

    总的来说,Dubbo的服务运行的三种方式体现了其设计理念——灵活性、高效性和可扩展性。通过合理地利用这三种方式,开发者可以构建出更加健壮、高性能的分布式系统。在使用Dubbo时,深入理解并灵活运用这三种服务运行...

    基于Springboot,Dubbo 等开发的分布式抽奖系统.zip

    每个服务都可以独立部署,降低了维护成本,同时增强了系统的健壮性。此外,Springboot的微服务思想使得这些服务能够独立升级,互不影响。 在具体实现上,抽奖逻辑可能包含随机算法,确保结果公正性。这通常涉及概率...

    dubbo-demo

    7. **容错机制**:学习Dubbo的失败重试、降级、熔断和隔离策略,以增强系统的健壮性。 8. **服务监控**:掌握如何集成Dubbo监控中心,实时监控服务的调用情况,包括QPS、成功率、延迟等指标。 9. **服务测试**:...

    Dubbo视频教程--基础篇的教材中1-5节源代码

    本教程的第01节,"使用Dubbo对传统工程进行服务化改造的思路介绍",将引导学习者了解服务化的必要性和Dubbo如何帮助实现这一目标。源码示例将展示如何将一个传统的单体应用拆分成微服务,以及如何配置Dubbo以实现...

    管理系统系列--基于Spring MVC+MyBatis+Shiro+Dubbo开发的分布式后台管理系统.zip

    Spring MVC和MyBatis负责业务逻辑的处理和数据访问,Shiro保障了系统的安全性,而Dubbo则实现了服务的分布式部署和治理,使得系统能够应对高并发场景,同时降低了系统维护的复杂度。 总的来说,这个基于Spring MVC+...

    RoadMap —— Java后端开发技能路书.zip

    13. **分布式与微服务**:理解分布式系统的基本概念,如CAP理论、分布式一致性,以及Spring Cloud、Dubbo等微服务框架的使用,是大型项目中的重要技能。 以上这些知识点构成了Java后端开发的广泛领域,通过不断学习...

    《亿级流量网站架构核心技术——跟开涛学搭建高可用高并发系统》

    《亿级流量网站架构核心技术——跟开涛学搭建高可用高并发系统》这本书深入探讨了在互联网行业中如何设计和构建能够处理亿级用户流量的高可用、高并发系统。作者开涛,作为业界资深专家,以其丰富的实战经验,为我们...

    Java分布式项目实战视频

    在设计分布式系统时,需要遵循一系列基本原则来确保系统的健壮性和高效性: - **无状态服务**:尽可能减少服务端状态存储,以便于水平扩展。 - **分层架构**:采用分层设计模式可以更好地管理复杂性,提高系统的可...

    aliduboo源代码实例(消费端)

    消费者端会根据业务需求选择合适的策略,确保系统的稳定性和健壮性。 5. **调用超时与重试**: 在服务调用中,设置合理的超时时间和重试次数是保障系统性能的关键。消费者会设定调用超时时间,超过这个时间未收到...

    精选_基于springboot+layui+Shiro实现的校园二手市场后台管理系统_源码打包

    同时,日志管理如Log4j或Logback,以及异常处理机制也是后台系统中必不可少的部分,它们可以帮助开发者追踪和解决问题,提升系统的健壮性。 总的来说,"基于SpringBoot+Layui+Shiro实现的校园二手市场后台管理系统...

    基于Go实现的分布式MQ消息队列

    本文将探讨一种基于Go语言实现的分布式消息队列——KiteQ,并深入剖析其设计理念和技术细节。 传统的RPC(Remote Procedure Call)调用模式虽然能够满足一些简单的服务间通信需求,但在复杂的微服务架构中却显得...

    大型网站技术架构:核心原理与案例分析 亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统

    Spring Cloud或Dubbo等框架提供了服务治理的解决方案,包括服务发现、熔断、限流和降级等策略,以增强系统的健壮性。 接着,我们不能忽视高可用性。这意味着系统即使在部分组件故障时也能正常运行。这需要设计冗余...

    java悟道心得

    通过try-catch-finally语句块,开发者可以有效地捕获并处理程序运行时可能出现的问题,保证程序的健壮性。同时,Java的垃圾回收机制自动化管理内存,避免了内存泄露,让开发者能更专注于业务逻辑。 20年的职场生涯...

    otus_architect

    《OTUS架构师之路——深度探索Java技术体系》 OTUS_architect,作为一个与Java相关的学习资源,旨在帮助开发者深入理解Java技术体系,提升架构设计能力。在这个项目中,我们将会探讨一系列Java核心技术,以及如何将...

    java_training

    Java作为一种广泛使用的高级编程语言,具有跨平台、面向对象、安全性和健壮性等特性,被广泛应用于企业级应用开发、Android移动开发、大数据处理等多个领域。"java_training"这个主题,很显然是针对Java的学习和训练...

Global site tag (gtag.js) - Google Analytics