`
gao_xianglong
  • 浏览: 467794 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

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

 

分布式配置管理平台与优雅停机存在什么必然联系?假设配置在配置中心的数据信息发生改变后,客户端感知并订阅到后,必然需要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原生是支持优雅停机的,其实也就是采用JDKShudownHook来实现,当然仅限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() {
    /* 尝试中断线程,且不再接收新请求 */
    tPool.shutdownNow();
    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来完成一些释放资源的操作,这里笔者选择拒绝新任务,且等待当前线程处理完当前任务,如果线程池中的所有线程都非活跃的情况,则代表程序可以安全的结束进程。

 

未经许可,不可转载

 

分享到:
评论

相关推荐

    pikachu是一款宠物小精灵商城的后台系统,整个后端项目采用了分布式微服务的架构

    在"Pikachu"系统中,SpringBoot与Dubbo的结合,实现了服务的快速启动和优雅停机,同时也方便了服务的集成测试和持续集成。 在提供的源码中,我们可以深入研究"Pikachu"系统的各个模块,了解如何构建和配置这些...

    Go-pmgo是一个采用Golang编写的Golang应用程序进程管理器

    6. **优雅停机**:在接收到停止命令时,`Go-pmgo` 会确保进程能够完成当前工作并安全退出,避免数据丢失或状态不一致。 7. **多平台支持**:由于`Go-pmgo` 是用Golang编写的,因此它具有跨平台的特性,可以在Linux...

    最新版windows nacos-server-2.0.2.zip

    - **优雅停机与升级**:通过`shutdown.cmd`命令优雅地停止Nacos,保证服务的平滑迁移和升级。 5. **集成实践**: - **Spring Cloud集成**:Nacos可与Spring Cloud框架无缝集成,提供服务发现和配置管理功能。 - ...

    dubbo用户指南

    - **服务降级与优雅停机**:支持服务降级策略,以及在不停止服务的情况下进行优雅停机。 ### 最佳实践与规划 - **服务化最佳实践**:根据业务需求和实际情况,采用最佳的服务化策略。 - **容量规划与性能测试**:...

    dubbo-user-book

    文档内容覆盖了Dubbo的快速启动、依赖管理、成熟度配置、用法示例、XML配置、属性配置、API配置、注解配置、启动时检查、集群容错、负载均衡、线程模型、直连提供者、只订阅只注册、静态服务、多协议、多注册中心、...

    dubbo用户手册

    - 介绍了如何配置服务降级策略以及实现优雅停机。 **主机绑定与日志适配** - 解释了如何配置 Dubbo 绑定到特定主机以及对日志的适配和管理。 **缓存与分布式事务** - 阐述了如何在 Dubbo 中使用缓存以及对...

    WLST学习资源

    - **远程管理**:WLST支持通过网络远程管理WebLogic Server实例,这对于分布式环境下的管理尤为重要。 - **接口丰富**:WLST提供了丰富的API,涵盖了几乎所有WebLogic Server的管理功能,包括但不限于服务器控制、...

    Dubbo用户手册

    同时,它还支持服务降级、优雅停机、连接控制等高级特性。 ### 配置示例 例如,使用XML配置时,需要在提供者端配置服务暴露(`&lt;dubbo:service/&gt;`),在消费者端配置服务引用(`&lt;dubbo:reference/&gt;`)。这些配置...

    dubbo_user_book

    服务降级与优雅停机 - **服务降级**:当服务出现异常或过载时,临时提供简化版本的服务,以确保系统的整体稳定性。 - **优雅停机**:服务在停止前能够完成当前正在进行的任务,并释放相关资源,确保服务的平滑关闭...

    dubbo技术介绍

    优雅停机 主机绑定 日志适配 访问日志 服务容器 Reference Config缓存 分布式事务13-1-13 U serG uide-zh -D ubbo -A libaba O pen S esam e code.alibabatech....

    Dubbo基础培训

    - **Graceful shutdown**:优雅停机允许服务提供者在停止服务前完成已有的请求,避免因服务突然停止导致的数据不一致或客户端异常。 - **配置继承与可编程配置**:服务提供者和消费者可以设定默认配置,注册中心也...

    Dubbo用户文档

    包括线程模型、直连提供者、只订阅、只注册、静态服务、多协议、多注册中心、服务分组、多...配置规则、服务降级、优雅停机、主机绑定、日志适配、访问日志、服务容器、ReferenceConfig缓存、分布式事务等方面的细节...

    dubbo中文文档说明

    还包括了参数回调、事件通知、本地存根、本地伪装、延迟暴露、并发控制、连接控制、延迟连接、粘滞连接、令牌验证、路由规则、配置规则、服务降级、优雅停机、主机绑定、日志适配、访问日志、服务容器、...

    graceful-shutdown-spring-boot:使用Spring Boot正常关闭(演示)

    在服务定义中,可以配置优雅停机的相关参数,以确保服务在停止时能够优雅地处理现有的请求。 综上所述,"graceful-shutdown-spring-boot"项目展示了如何在Spring Boot应用中实现优雅停机,同时考虑了Docker环境下的...

    Dubbo Developer Guide.pdf

    - **优雅停机**:确保服务可以平滑下线,不丢失请求。 - **主机绑定**:允许服务绑定到特定的 IP 地址。 - **日志适配**:允许集成各种日志系统。 - **访问日志**:记录服务调用日志。 ### 环境部署 - **服务容器**...

    rabbitMQ3.85+Erlang_win64_23.0.zip

    安装完成后,可以启动RabbitMQ服务器,并通过管理界面或API进行配置和管理。对于开发者来说,了解Erlang的基本概念和RabbitMQ的工作原理,以及如何配置和使用RabbitMQ服务,都是实现高效消息传递系统的关键。

    dubbo-用户指南.pdf

    - 服务降级、优雅停机:提供了故障恢复和系统维护时的策略。 - 服务容灾、分布式事务:涉及容错和一致性处理。 - Reference:作为用户指南,对 Dubbo 的引用配置会有详尽的指导。 综上,Dubbo 是一个全面而强大的...

    Apache Kafka.pdf

    1. **基本操作**:包括添加和删除主题、修改主题属性、优雅停机等。 2. **数据中心部署**:考虑跨数据中心的容灾方案,提高系统的可用性和稳定性。 3. **关键配置项**:列出对集群性能有重大影响的配置参数。 4. **...

    Dubbo面试题(2022最新版)

    4. **Dubbo如何优雅停机?** 可以通过Dubbo的管理控制台或API接口来停止服务,确保所有正在执行的任务完成后再关闭服务。 #### 十、SPI 1. **DubboSPI和JavaSPI区别?** - **灵活性**:DubboSPI提供了更灵活的...

    elixir.rar

    综上所述,Elixir结合了函数式编程的优雅、元编程的灵活性以及Erlang的并发和分布式特性,是构建高可用、高性能系统的一个理想选择。无论你是初学者还是经验丰富的开发者,Elixir都能为你提供一个创新且高效的编程...

Global site tag (gtag.js) - Google Analytics