《分布式配置管理平台与优雅停机》
分布式配置管理平台与优雅停机存在什么必然联系?假设配置在配置中心的数据信息发生改变后,客户端感知并订阅到后,必然需要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() {
/* 尝试中断线程,且不再接收新请求 */
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"系统中,SpringBoot与Dubbo的结合,实现了服务的快速启动和优雅停机,同时也方便了服务的集成测试和持续集成。 在提供的源码中,我们可以深入研究"Pikachu"系统的各个模块,了解如何构建和配置这些...
6. **优雅停机**:在接收到停止命令时,`Go-pmgo` 会确保进程能够完成当前工作并安全退出,避免数据丢失或状态不一致。 7. **多平台支持**:由于`Go-pmgo` 是用Golang编写的,因此它具有跨平台的特性,可以在Linux...
- **优雅停机与升级**:通过`shutdown.cmd`命令优雅地停止Nacos,保证服务的平滑迁移和升级。 5. **集成实践**: - **Spring Cloud集成**:Nacos可与Spring Cloud框架无缝集成,提供服务发现和配置管理功能。 - ...
- **服务降级与优雅停机**:支持服务降级策略,以及在不停止服务的情况下进行优雅停机。 ### 最佳实践与规划 - **服务化最佳实践**:根据业务需求和实际情况,采用最佳的服务化策略。 - **容量规划与性能测试**:...
文档内容覆盖了Dubbo的快速启动、依赖管理、成熟度配置、用法示例、XML配置、属性配置、API配置、注解配置、启动时检查、集群容错、负载均衡、线程模型、直连提供者、只订阅只注册、静态服务、多协议、多注册中心、...
- 介绍了如何配置服务降级策略以及实现优雅停机。 **主机绑定与日志适配** - 解释了如何配置 Dubbo 绑定到特定主机以及对日志的适配和管理。 **缓存与分布式事务** - 阐述了如何在 Dubbo 中使用缓存以及对...
- **远程管理**:WLST支持通过网络远程管理WebLogic Server实例,这对于分布式环境下的管理尤为重要。 - **接口丰富**:WLST提供了丰富的API,涵盖了几乎所有WebLogic Server的管理功能,包括但不限于服务器控制、...
同时,它还支持服务降级、优雅停机、连接控制等高级特性。 ### 配置示例 例如,使用XML配置时,需要在提供者端配置服务暴露(`<dubbo:service/>`),在消费者端配置服务引用(`<dubbo:reference/>`)。这些配置...
服务降级与优雅停机 - **服务降级**:当服务出现异常或过载时,临时提供简化版本的服务,以确保系统的整体稳定性。 - **优雅停机**:服务在停止前能够完成当前正在进行的任务,并释放相关资源,确保服务的平滑关闭...
优雅停机 主机绑定 日志适配 访问日志 服务容器 Reference Config缓存 分布式事务13-1-13 U serG uide-zh -D ubbo -A libaba O pen S esam e code.alibabatech....
- **Graceful shutdown**:优雅停机允许服务提供者在停止服务前完成已有的请求,避免因服务突然停止导致的数据不一致或客户端异常。 - **配置继承与可编程配置**:服务提供者和消费者可以设定默认配置,注册中心也...
包括线程模型、直连提供者、只订阅、只注册、静态服务、多协议、多注册中心、服务分组、多...配置规则、服务降级、优雅停机、主机绑定、日志适配、访问日志、服务容器、ReferenceConfig缓存、分布式事务等方面的细节...
还包括了参数回调、事件通知、本地存根、本地伪装、延迟暴露、并发控制、连接控制、延迟连接、粘滞连接、令牌验证、路由规则、配置规则、服务降级、优雅停机、主机绑定、日志适配、访问日志、服务容器、...
在服务定义中,可以配置优雅停机的相关参数,以确保服务在停止时能够优雅地处理现有的请求。 综上所述,"graceful-shutdown-spring-boot"项目展示了如何在Spring Boot应用中实现优雅停机,同时考虑了Docker环境下的...
- **优雅停机**:确保服务可以平滑下线,不丢失请求。 - **主机绑定**:允许服务绑定到特定的 IP 地址。 - **日志适配**:允许集成各种日志系统。 - **访问日志**:记录服务调用日志。 ### 环境部署 - **服务容器**...
安装完成后,可以启动RabbitMQ服务器,并通过管理界面或API进行配置和管理。对于开发者来说,了解Erlang的基本概念和RabbitMQ的工作原理,以及如何配置和使用RabbitMQ服务,都是实现高效消息传递系统的关键。
- 服务降级、优雅停机:提供了故障恢复和系统维护时的策略。 - 服务容灾、分布式事务:涉及容错和一致性处理。 - Reference:作为用户指南,对 Dubbo 的引用配置会有详尽的指导。 综上,Dubbo 是一个全面而强大的...
1. **基本操作**:包括添加和删除主题、修改主题属性、优雅停机等。 2. **数据中心部署**:考虑跨数据中心的容灾方案,提高系统的可用性和稳定性。 3. **关键配置项**:列出对集群性能有重大影响的配置参数。 4. **...
4. **Dubbo如何优雅停机?** 可以通过Dubbo的管理控制台或API接口来停止服务,确保所有正在执行的任务完成后再关闭服务。 #### 十、SPI 1. **DubboSPI和JavaSPI区别?** - **灵活性**:DubboSPI提供了更灵活的...
综上所述,Elixir结合了函数式编程的优雅、元编程的灵活性以及Erlang的并发和分布式特性,是构建高可用、高性能系统的一个理想选择。无论你是初学者还是经验丰富的开发者,Elixir都能为你提供一个创新且高效的编程...