分布式配置管理平台与优雅停机

标签: 分布 管理 平台 | 发表时间:2017-08-22 16:25 | 作者:
出处:http://gao-xianglong.iteye.com

《分布式配置管理平台与优雅停机》

 

分布式配置管理平台与优雅停机存在什么必然联系?假设配置在配置中心的数据信息发生改变后,客户端感知并订阅到后,必然需要reset来及时响应,最典型的场景就是服务降级(开关)。

 

一些根据配置信息生成的对象实例(比如JDBC对象实例、Jedis对象实例),则需要重新生成新的对象实例,而不是简单的对目标值做reset。针对这种对象,本文提供2种方案可供参考:

1、动态注册Bean实例方案;

2、优雅停机实现restart方案。

 

如果项目中采用了Spring,那么可以选择对IOC容器中的那些Bean实例进行“剔除”后重新注册,这其实就是不重启状态下的动态注册。但这种方案却存在一个较为致命的缺陷,生产环境中,尤其是用户流量较大的网站,假设配置中心的数据源信息发生了变更,客户端感知并订阅后需要立马释放之前的资源连接,也不管之前的连接上是否还有未执行完成的任务,那么这对业务肯定会产生较为严重的影响。

 

那么我们来看第2种方案,优雅停机后restart。在Linux上,相信大家都使用过kill命令,在生产环境中,笔者最长用的就是kill(即kill -15 )PID和kill -9 PID,无论执行哪一个命令,最终程序进程都会停止,但是仍然存在区别。我们可以先来看一下信号变量,执行命令“kill -l”,如下所示:

 

简单来说,假设执行的是kill -15命令,那么操作系统会发送一个SIGTERM的信号对应用程序,应用程序收到SIGTERM信号后,会对当前所占用的资源进行释放,然后才会相对安全优雅的结束进程。而kill -9命令则恰恰相反,强制结束进程,可能会造成资源无法释放等问题。

 

谈到了kill,那么接下来要谈的就是如何让程序实现优雅停机,也就是说,假设数据源信息发生变化,应用系统要首先拒绝新的任务请求,并且等待那些还未执行完成的线程处理完成后,再restart,相对于第1种方案,采用此方案会更加安全可靠。

 

假设我们采用dubbo实施服务化后,那么dubbo原生是支持优雅停机的,其实也就是采用JDK的ShudownHook来实现,当然仅限kill -15 PID。这里也顺带说一下dubbo优雅停机的原理,如下所示:

服务提供方

· 停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。

· 然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。

服务消费方

· 停止时,不再发起新的调用请求,所有新的调用在客户端即报错。

· 然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。

 

接下来,我们再来尝试通过ShudownHook模拟优雅停机,如下所示:

public  class ShutdownHookDemo {

public ThreadPoolExecutor tPool = new ThreadPoolExecutor(

10, 100, 1, TimeUnit. SECONDS,

new ArrayBlockingQueue<Runnable>(2),

new CallerRunsPolicy());

 

public ShutdownHookDemo() {

init();

int threadSize = tPool.getCorePoolSize();

final CountDownLatch latch = new CountDownLatch(threadSize);

for ( int i = 0; i < threadSize; i++) {

tPool.execute( new Thread() {

public  void run() {

try {

/* 休眠10s */

TimeUnit. SECONDS.sleep((( int) (Math. random() * 15)));

} catch (Exception e) {

e.printStackTrace();

} finally {

latch.countDown();

}

}

});

}

try {

latch.await();

System. out.println("所有任务执行结束");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

 

public  void init() {

Runtime. getRuntime().addShutdownHook( new Thread() {

public  void run() {

while ( true) {

int activeCount = tPool.getActiveCount();

System. out.println("活跃线程-->" + activeCount);

if (0 == activeCount)

break;

try {

TimeUnit. SECONDS.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

}

 

public  static  void main(String[] args) {

new ShutdownHookDemo();

}

}

 

 

上述程序示例中,总共会有10条线程分别“处理”任务,耗时都在<=15S内,那么假设使用kill -15 PID命令终止进程后,通过ShutdownHook注册的钩子就会发生作用,一般来说,开发人员可以通过ShutdownHook来完成一些释放资源的操作,这里笔者选择等待当前线程处理完当前任务,如果线程池中的所有线程都非活跃的情况,则代表程序可以安全的结束进程。

 

未经许可,不可转载

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [分布 管理 平台] 推荐:

分布式配置管理平台与优雅停机

- - gao_xianglong的自言自语
《分布式配置管理平台与优雅停机》. 分布式配置管理平台与优雅停机存在什么必然联系. 假设配置在配置中心的数据信息发生改变后,客户端感知并订阅到后,必然需要reset来及时响应,最典型的场景就是服务降级(开关). 一些根据配置信息生成的对象实例(比如JDBC对象实例、Jedis对象实例),则需要重新生成新的对象实例,而不是简单的对目标值做reset.

spring+hibernate+atomikos 分布式事务管理

- - 企业架构 - ITeye博客
网上有很多的atomikos的分布式事务管理的配置,但是大多数都是同一类型的数据库,并没有跨数据库类型的配置. 使用的数据库是Oracle和mysql. . .

Spark高效的分布式管理

- - 企业架构 - ITeye博客
Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法.

Android平台的五个免费时间管理软件

- 虾皮 - GTD Life
这是来自于GTDLife.cn交流圈里bizlai得文字,用简短得文字很好得概括了Android下得几个免费得时间管理软件. 官方网 站:http://weloveastrid.com/. 软件介绍:是Android Market应用商店选出的最佳免费的时间管理软件. 支持同步数据至Remember The Milk(http://www.rememberthemilk.com/).

Google發表iOS平台「Blogger」網站管理軟體

- Amo - RakunaMac
根據気になる、記になる…網站消息,稍早Google針對免費網站服務「Blogger」釋出iOS平台管理軟體(App Store),提供中文介面.

统一资源管理与调度平台(系统)介绍

- - 董的博客
Dong | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及 版权声明. 网址: http://dongxicheng.org/mapreduce-nextgen/mesos_vs_yarn/. 随着互联网的高速发展,基于数据密集型应用的计算框架不断出现,从支持离线处理的MapReduce,到支持在线处理的Storm,从迭代式计算框架Spark到流式处理框架S4,…,各种框架诞生于不同的公司或者实验室,它们各有所长,各自解决了某一类应用问题.

云计算平台管理的三大利器Nagios、Ganglia和Splunk

- - 技术改变世界 创新驱动中国 - 《程序员》官网
综合利用Nagios、Ganglia和Splunk搭建起的云计算平台监控体系,具备错误报警、性能调优、问题追踪 和自动生成运维报表的功能. 有了这套系统,就可轻松管理Hadoop/HBase云计算平台. 云计算早已不是停留在概念阶段了,各大公司都购买了大量的机器,开始正式的部署和运营. 而动辄上百台的性能强劲的服务器,为运营管理带来了巨大的挑战.

学生信息小管家——Ontract教育管理平台

- - TECH2IPO创见
我们都知道,现在的老师们多数都不熟悉自己所教学生们的情况,有的甚至叫不出全班同学的名字. 并不全是因为这些老师们不负责任,而是因为他们真的太忙了. 老师们不仅要熟知每一名学生的家庭信息和学习情况,还要针对这些信息制定出相应的管理方案和教学方案,这些繁琐的步骤往往让他们手忙脚乱,老师的职责不只是教书育人吗.

腾讯敏捷项目管理平台TAPD初探

- - 标点符
腾讯开发了自己的敏捷项目管理工具 TAPD,整个工具类似于ThoughtWorks的Mingle;同时借鉴了jetbrains的youtrack. 由于不是腾讯的内部人员,所以整体都是通过网上的信息拼凑起来的. 对TAPD平台的Story、Bug、Task的作用进行明确划分. 在此前对TAPD的使用中,对三个工具的使用有些混乱,经常出现将需求提在Bug列表中的情况.

元数据驱动的主数据管理平台

- - 人月神话的BLOG
前面谈MDM主数据管理的文章也比较多,本篇文章主要还是想谈下元数据驱动下的MDM主数据管理平台的核心构建思路. 因为对于一个MDM系统更多应该理解为结合了元数据驱动和建模,结合了流程引擎和ETL服务能力的一个快速开发和配置平台. 这个思路和原来我们谈到IBM-CQ变更和缺陷管理系统的构建思路完全是一致的.