`
iamzhongyong
  • 浏览: 806666 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java分布式系统开关功能设计(服务升降级)

 
阅读更多

    ​    ​首先讲一下开关的由来,例如东京在6月18日做店庆促销活动,在交易下单环节,可能需要调用A、B、C三个接口来完成,但是其实A和B是必须的,C只是附加的功能(例如在下单的时候做一下推荐),可有可无,在平时系统没有压力,容量充足的情况下,调用下没问题,但是在类似店庆之类的大促环节,系统已经满负荷了,这时候其实完全可以不去调用C接口,怎么实现这个呢?改代码?no,no,no,这样太不敏捷,此时开关诞生了,开发人员只要简单执行一下命令或者点一下页面,就可以关掉对于C接口的调用,在大促过去之后,再把开关恢复回去即可。

 

    ​    ​问题一:在单个java系统中如何实现开关功能?

    ​    ​其实对于开关来说,对应Java中的类型,很好映射,就是一个boolean值,在需要做开关操作的地方,调用这个属性,判断状态,然后走相应的逻辑即可。这个类是一个单例,保证全局唯一(代码就不写了,单例模式一般是学习设计模式中最开始接触的呵呵)。

 

    ​    ​问题二:单个java系统中,如何实现开关值变更的操作呢?

    ​    ​在单机系统中,改变开关的状态很简单(留一个口子,外部可以改变属性的值,例如改为true或者false),这时候,可以是页面来维护开关,通过页面的点击类改变这个全局唯一的属性,从而实现开关动作的触发。

 

    ​    ​问题三:多个同构java系统,如何实现开关状态的同步呢?

    ​    ​通过一和二的介绍,在单机情况下,开关的变更可以了,但是在多个同构(这里的同构,值得是部署的同一套代码,逻辑完全相同,类似Master和Slaver的模式)系统中,如何保持一致呢?单例模式,开关属性是被加载到本地缓存,就是说java一直持有的对象,在FullGC的时候回收不走的那种。这个时候,如果要保持各个系统中开关属性状态的一致,就需要从第三方外部系统中加载这个数据。

    ​    ​什么系统能充当第三方外部系统呢?可以是一个数据库访问系统,我们暂且称之为MetaServer,开关的属性防止在DB中,然后MetaServer提供页面来修改数据,同时提供接口读取开关的数据,在应用启动的时候,通过MetaServer来读取数据,加载到本地缓存中。这时候就有个问题,就是我通过MetaServer的页面改变了值,各个应用如何知道我改变了属性呢?这个时候就需要通过一些办法(办法很多,可以是消息系统,可以是zookeeper,可以是页面触发)来清理一下开关属性的缓存,让缓存重新加载一下,从而实现最新的状态获取。

    ​    ​总体思路就是:metaServer维护开关数据--应用读取DB中的数据到本地缓存--DB中数据变更--触发开关属性缓存重新加载。

    ​    ​这个是不是有点复杂,有没有更加简单的办法?当然有了,之前淘宝开源了一个系统diamond(持久化配置管理系统,http://code.taobao.org/p/diamond/wiki/index/),其实可以理解为“配置信息的伪推送服务”,例如我变更了一个开关的属性,不再需要做清理缓存的事情,diamond帮你做掉了(原理很简单,例如系统A订阅了在diamond中的开关信息,这时候A会启动一个线程,每隔一段时间来轮循diamond的服务端,看看开关属性的数据有没有变更,如果有变更,在diamond服务端来加载最新的数据)。

    ​    ​总体思路是:在diamond中维护配置信息--系统订阅开关属性--系统轮循配置是否有变更,有变更直接就变掉了。

 

    ​    ​问题四:开关设计的几个坑

    ​    ​有时候,我们为了方便,没有借助问题三种的MetaServer或者diamond的方式,就是留了一个HTTP的接口来触发修改开关(多台机器的话,可以写批量脚本),这时候其实需要我们在apache或者nginx中,把这个URL的访问禁止掉,防止恶意用户在外部拼凑链接来进行开关的变动,这时候只能在服务器上通过linux的curl来触发操作了。

    ​    ​还有一个,就是如果通过HTTP的形式来修改开关的属性,有个是需要注意的,就是开关的执行要幂等操作,这样方便操作,避免出现集群中数据不一致的状态(就是执行开,开关就是开,不能第一次执行是开,第二次执行是关)。

 

    ​    ​问题五:开关组合情况下怎么搞?

    ​    ​上面的几种情况,仅仅是执行单个开关,应该比较简单。但是我同时又A、B、C三个开关,在不同的业务场景下,可能需要关闭A和B开关,在另外一个场景下,可能需要关闭A和C开关,这时候认为操作有可能会有遗漏或者疏忽,怎么搞呢?在单独属性开关的基础上做封装,例如A和B上面增加一层属性,暂且叫“AB”,修改AB的值,对应的系统修改A和B的值,这样就避免人肉记住一些组合。

 

    ​    ​问题六:如何实现自动升降级?

    ​    ​上面的情况,都是在提起可以预知的情况下,我们做一些人为的操作,这个能不能自动化?当然可以,就是这一小节讨论的自动升降级。

    ​    ​举例子,现在东京和作的外部物流公司有多家,会调用它们的系统或者物流节点的状态,这个时候,物流公司系统是不稳定的,如果挂了或者响应时间慢了,对于自身的系统会影响比较大,比较理想的办法是,在物流公司系统出现问题的时候,这块逻辑自动降级处理,然后等物流公司系统好了之后,再把这部分逻辑自动升级,整个过程没有人为参与,自动保持系统稳定性。这里说一下总体思路:

    ​    ​第一步:搞一个计数器,记录接口,暂定A的调用成功次数、失败次数以及响应时间;

    ​    ​第二步:将这些信息放入队列中,同时设置阀值(例如RT超过5秒就降级,1秒就升级)以及阀值触发改动的开关;

    ​    ​第三部:异步启动一个线程,扫描队列,达到我们的条件,就触发做变更(有个问题,就是加入业务降级了,这时候就没有调用量,也就没有了自动升级的条件了,怎么搞呢?这时候业务降级,并不是完全100%的停掉,可以预留一部分流量继续调用A,把A调用的信息放入队列中,根据这些信息,就能实现升级了);

 

    ​    ​总结:

    ​    ​上面这些是在陆续的系统维护中尝试或者看到的处理办法,通过开关的方式,实现系统的升降级,从而更好的保护系统。这篇文章只是阐述了大体的思路,没有涉及到具体的代码,希望能够达到抛砖引玉的作用。

 

 

 

13
5
分享到:
评论
11 楼 LinApex 2014-08-03  
jmx,mbean.
10 楼 iamzhongyong 2013-07-04  
wujiazhao88 写道
用zookeeper watcher, 修改节点(开关数据)的时候改变开关即可.

是的,这是zk的一个典型应用场景呵呵
9 楼 wujiazhao88 2013-07-04  
用zookeeper watcher, 修改节点(开关数据)的时候改变开关即可.
8 楼 skzr.org 2013-07-03  
iamzhongyong 写道
skzr.org 写道
很容易懂的,没有意料之外的东西。
大家是不是也是这样玩的,有详细点的系统设计图就更好了。
顶起

呵呵,其实本来是想画图的,但是晚上12点开始写这篇文章,在家里笔记本上,没有好的画图工具,就没画图


这个貌似可以做个通用的简单工具包开源供大家使用:
IFlagService {
   void put(String key, Object value);
   <T> T get(String key);
}
AbstractFlagService implements IFlagService {
  Timer timer; //定时刷新
  balabala... 定时刷新实现
}


FlagServiceDbImpl extends AbstractFlagService {
  JdbcTemplate jdbc;
  balabala...
}

FlagServiceXXXXImpl extends AbstractFlagService {
    balabala...
}
7 楼 iamzhongyong 2013-07-03  
wsc830719 写道
我也在琢磨 zookeeper,相信作者已经读过了它的源码了。里面的思想zookeeper里面到处都是啊。文章浅显易懂,欣赏。希望作者写下 zookeeper服务器,集群下是如何维护数据统一的。我看到这了,还没怎么看呢

呵呵,后面会写一下zk的东西。
6 楼 iamzhongyong 2013-07-03  
novembersky 写道
不错,思路清晰,不过细节介绍的少一些,很多时候,魔鬼藏在细节当中。我相信实施过程中,不止这些坑的

是的,只是简单阐述一下思路,抛砖引玉吧。时间中惨痛的教训很多。因为开关大都是用来保命的,有时候,关键的时候用不了还是很痛苦的
5 楼 iamzhongyong 2013-07-03  
skzr.org 写道
很容易懂的,没有意料之外的东西。
大家是不是也是这样玩的,有详细点的系统设计图就更好了。
顶起

呵呵,其实本来是想画图的,但是晚上12点开始写这篇文章,在家里笔记本上,没有好的画图工具,就没画图
4 楼 novembersky 2013-07-03  
不错,思路清晰,不过细节介绍的少一些,很多时候,魔鬼藏在细节当中。我相信实施过程中,不止这些坑的
3 楼 须等待 2013-07-03  
好经验,不知道LZ涉及到的生产环境下的负载数据是怎么样的?

另外LZ说的全局配置,用zookeeper是一个不错的实践
2 楼 wsc830719 2013-07-03  
我也在琢磨 zookeeper,相信作者已经读过了它的源码了。里面的思想zookeeper里面到处都是啊。文章浅显易懂,欣赏。希望作者写下 zookeeper服务器,集群下是如何维护数据统一的。我看到这了,还没怎么看呢
1 楼 skzr.org 2013-07-03  
很容易懂的,没有意料之外的东西。
大家是不是也是这样玩的,有详细点的系统设计图就更好了。
顶起

相关推荐

    Java分布式架构设计实战视频课程(2022最新版,13章全)

    Java分布式架构设计实战课程是2022年最新的学习资源,涵盖了从基础到高级的全方位内容,旨在帮助开发者深入理解并掌握Java在分布式系统中的应用。这套课程共有13个章节,每个章节都针对特定的分布式架构技术或概念...

    Java分布式实战指南.pdf

    Sentinel作为服务保护框架,提供了服务降级、隔离、熔断和限流等功能,增强了系统的稳定性和容错性。同时,通过引入RocketMQ作为消息总线,实现了异步处理和解耦。 在分布式基础设施环境构建方面,书中提到了XXL-...

    Java分布式程序设计

    Java分布式程序设计是现代企业级应用开发中的重要技术领域,它允许通过网络连接的多台计算机协同工作,处理大规模的数据和服务。在这个主题中,我们将深入探讨Java如何实现分布式系统,以及相关的关键概念和技术。 ...

    大规模分布式存储系统:原理解析与架构实战,分布式服务框架原理与实践_李林锋著

    《大规模分布式存储系统:原理解析与架构实战》与《分布式服务框架原理与实践》这两本书深入探讨了现代IT行业中至关重要的两个主题:分布式存储系统和分布式服务框架。这两者都是构建可扩展、高可用性及高性能应用的...

    大规模分布式系统架构与设计实战

    完整版”很可能是包含一系列实战案例、代码示例、最佳实践的综合教程,可以帮助读者从理论到实践,全面学习分布式系统设计的各种技巧和挑战。 总结来说,构建大规模分布式系统需要深入了解服务化、数据一致性、负载...

    Java分布式相关面试题汇总

    在Java分布式系统中,分布式事务是一项复杂的技术,需要深入了解事务的概念、特性和类型。下面我们将详细介绍分布式事务的概念、ACID特性、本地事务、全局事务、TX协议、XA协议、两阶段提交协议、BASE理论和CAP定理...

    java分布式系统架构问题解决与瓶颈突破

    在《Java分布式系统架构问题解决与瓶颈突破》一书中,作者深入探讨了互联网环境中大型网站架构的演变历程,以及在这一过程中所面临的关键技术挑战及其解决方案。这本书是为那些希望成为架构师或已经在该领域工作的...

    关于分布式系统的ppt

    9. **分布式系统设计原则**:讲解CAP、FALLacies of Distributed Computing(分布式计算的七个谬误)等设计原则,以及如何在实际系统设计中应用这些原则。 10. **容错与恢复机制**:介绍如何设计高可用的分布式系统...

    分布式服务框架 分布式系统概念与设计 原书第5版 分布式服务框架原理与实践_李林锋著

    分布式系统的概念始于对单一庞大系统进行拆分,通过将功能模块化并分布在网络的不同节点上运行,以实现更高效、灵活的系统架构。这种架构允许服务之间通过网络通信协同工作,提供高可用性和可伸缩性。分布式系统的...

    南京大学分布式系统研究生课件

    8. **分布式服务与微服务**:阐述服务发现、负载均衡、熔断和降级等服务治理概念,以及微服务架构的设计原则。 9. **容错与恢复**:讲解如何设计容错机制,如备份、检查点、故障检测和恢复策略。 10. **安全与隐私...

    Java分布式RPC服务框架教程,包括DubboDubbox,Motan,gRPC..zip

    Java分布式RPC服务框架是现代大型互联网应用中不可或缺的技术组件,它们允许不同的服务之间进行高效、透明的通信。本教程将深入探讨三个主流的Java RPC框架:Dubbo、Dubbox和Motan,以及gRPC,一个由Google推出的高...

    【JAVA分布式系列】dubbo

    总的来说,Dubbo作为一款成熟的Java分布式服务框架,不仅简化了服务的开发和调用,还提供了全方位的服务治理方案。它在提升系统性能、保障服务稳定性和易维护性方面都有着显著的优势,是构建大型分布式系统的理想...

    分布式系统原理与范型 第二版.zip

    15. 分布式系统的设计原则:如开放性、透明性、可扩展性和自愈性,指导着分布式系统的设计和实现。 以上只是分布式系统原理与范型的一部分核心知识点,实际的教材或报告可能会涵盖更多细节,包括具体的实现技术、...

    电网工程设计管理分布式系统的设计与实现.pdf

    在系统设计上,分布式系统遵循了面向服务架构(SOA)原则,以Web服务接口标准实现系统间的数据通信协调,保证了系统的松耦合性。系统设计采用了自顶向下的分解方法,并通过统一建模语言(UML)对系统原型、框架以及...

    基于dubbo的分布式系统架构的视频教程

    ### 基于Dubbo的分布式系统架构的关键知识点 #### 一、Dubbo简介与应用场景 **1.... Dubbo是一款高性能、轻量级的开源...无论是对于初学者还是有一定经验的开发者来说,学习Dubbo都是提升分布式系统设计能力的重要途径。

    分布式常见的面试题(java)

    以上知识点涵盖了分布式系统的关键组件和常见面试话题,深入理解这些概念和技术,对于提升分布式系统的设计和实施能力至关重要。在面试中,除了理论知识,还需要展示实际项目经验,以及如何解决在分布式环境下遇到的...

    分布式设计-降级设计

    分布式的设计以及hystrix的一些Q&A, 其中如果有其他的第三方工具再进行补充

    Java 分布式架构训练营 - 第一期 服务治理2023年 视频教程 下载 因为太大存百度云盘2.zip

    Java分布式架构训练营第一期的主题聚焦于服务治理,这是一门深入探讨如何在大型、复杂的分布式系统中管理和协调服务的课程。2023年的版本更新可能包含了最新的技术和最佳实践,旨在帮助开发者提升构建和维护高可用、...

Global site tag (gtag.js) - Google Analytics