如何优雅地停止长连接网关服务

文章详细阐述了如何实现服务优雅关闭,特别是对于管理大量TCP连接的长连接网关。通过JVM的ShutdownHook机制,Spring的ContextClosedEvent以及Netty的shutdownGracefully方法,确保服务在关闭过程中处理完现有任务并避免新请求。文中以开源项目SONA为例,展示了如何在Spring和Netty框架下进行优雅关闭操作,保证系统的高可用性。

优雅地停止服务,也就是要保证把没有处理完的工作处理完成。比如停止一些依赖的服务,输出一些日志,发一些信号给其他的应用系统等,这个在保证系统的高可用中是非常有必要的。

尤其像长连接网关这种,管理了大量的TCP 连接,绝不能直接暴力关闭,必须要保证已有的任务全都处理完,并且在关闭的过程中不会有新的请求进来。

本文以开源项目SONA为例,详细解析网关服务优雅的原理和实现,帮助读者更好理解和实践。本文最后附上开源项目地址。


前言

Sona 平台是一个搭建语音房产品的全端解决方案,包含了房间管理、实时音视频、房间IM、长连接网关等能力。其中最基础核心的就是长连接网关。

我们很多时候都需要安全的将服务停止,也就是把没有处理完的工作继续处理完成。比如停止一些依赖的服务,输出一些日志,发一些信号给其他的应用系统等,这个在保证系统的高可用中是非常有必要的。

尤其像 长连接网关这种,管理了大量的TCP 连接,绝不能直接暴力关闭,必须要保证已有的任务全都处理完,并且在关闭的过程中不会有新的请求进来。


一、优雅关闭

服务的优雅关闭通常都是利用 JDK 里面提供的 Runtime.addShutDownHook(Thread hook)方法,JVM 提供一种 ShutdownHook(钩子)机制,当 JVM 接受到系统的关闭通知之后,会调用 ShutdownHook 内的方法,用以完成清理操作,从而平滑的退出应用。

  1. 程序正常退出
  2. 使用System.exit()
  3. 终端使用Ctrl+C触发的中断
  4. 系统关闭
  5. OutofMemory宕机
  6. 使用Kill pid杀死进程(使用kill -9是不会被调用的)

像Spring 、Dubbo 等都是基于这个实现的优雅关闭

二、Spring 优雅关闭

Spring 框架本身也依赖于 shutdown hook 执行优雅停机,通过调用 AbstractApplicationContext的 registerShutdownHook 方法

在 doClose 方法里面,主要做了如下几件事:

  1. 发布 ContextClosedEvent 事件(Spring 里面默认使用同步方式执行事件发布)
  2. 执行 LifecycleProcessor的 onClose 方法 (很多 spring 相关的jar里面会基于LifecycleProcessor 在
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值