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

标签: 管理 台与 | 发表时间:2017-08-22 08: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.

管理

- - 人月神话的BLOG
对于中小企业而言现在管理上欠缺的不是人治或者说儒家佛家等东方管理思想,而真正欠缺的是西方法治的科学管理方法. 现在很多中小企业花很多钱去听什么东方管理思想的培训是误入歧途,东西方管理思想需要融合,但是基础还是科学的管理方法和模式. 而在这个里面最重要的仍然是流程管理,知识管理,质量管理,项目管理这些内容,而不是简单的纯管理.

REDO管理

- - CSDN博客数据库推荐文章
一、什么是REDO LOG.  REDOLOG文件是十分重要的文件,它记录了Oracle的所有变化,是数据库实例恢复机制中最为关键的组成部分.     GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME     NEXT_CHANGE# NEXT_TIME.

日志管理

- - CSDN博客系统运维推荐文章
#很关键 [root@client01 ~]# ls /var/log/ anaconda.ifcfg.log. tallylog #关键日志,大部分记录在里面 [root@client01 ~]# ls /var/log/messages /var/log/messages. [root@client01 ~]# ps -ef|grep log #系统日志服务 root.

Firefox 权限管理

- Daimon - LinuxTOY
在最近的 Firefox 6 中引入了一个新的权限管理组件,可以细致的调整访问的每个网站权限. 该功能已经内置到 Firefox 6 以后的版本中,在地址栏输入 about:permissions 打开如下图所示:. 新的界面十分直观,希望可以更方便用户细微调整隐私策略. 消息来源:Pinguy OS Blog.

Hadoop权限管理

- Roger - 董的博客
本文介绍的Hadoop权限管理包括以下几个模块:. 用于按组为单位组织管理,某个用户只能向固定分组中提交作业,只能使用固定分组中配置的资源;同时可以限制每个用户提交的作业数,使用的资源量等. 包括作业提交权限控制,作业运行状态查看权限控制等. 如:可限定可提交作业的用户;可限定可查看作业运行状态的用户;可限定普通用户只能修改自己作业的优先级,kill自己的作业;高级用户可以控制所有作业等.

管理與領導

- 潇荣 - Mr. Jamie 看網路與創投
領導」已經是個幾十個世紀那麼老的木乃伊梗,Seth Godin 幾天前還是有辦法寫出一篇非常簡短,但卻非常有力的文章,他說:. 「經理人」的工作是讓他的員工重複昨天做的事情,但要快一點、要便宜一點. 「領導者」,相對的,知道他們要去哪裡,也知道如果要去到那裡,他需要他的族人,需要給他領導的人們工具,讓他們創造些什麼.

Oracle索引管理

- - CSDN博客数据库推荐文章
     语法:create index 索引名称 on 表名称(列名称1,列名称2,.......) tablespace 表空间名称;.     例子:create index  ind_enno on test01(enno) tablespace system;.     创建唯一索引:create unique index 索引名称 on 表名称(列名称1,列名称2,......) tablespace 表空间名称.

App缓存管理

- - ITeye博客
无论大型或小型应用,灵活的缓存可以说不仅大大减轻了服务器的压力,而且因为更快速的用户体验而方便了用户. Android的apk可以说是作为小型应用,其中99%的应用并不是需要实时更新的,而且诟病于蜗牛般的移动网速,与服务器的数据交互是能少则少,这样用户体验才更好,这也是我们有时舍弃webview而采用json传输数据的原因之一.

DOS命令管理

- - CSDN博客推荐文章
DOS远程桌面连接命令 mstsc /v: 192.168.1.250 /console. cmd          运行        command. 删除文件        rd        文件名/S. 创建文件        MD        文件名 . 1.        net user admin godmour /add 新建一个用户名为 admin 密码为 godmour 默认为user组成员.