线程池如何监控,才能帮助开发者快速定位线上错误?

大部分情况下,线程池的运行情况对于使用者来说是个黑盒

运行情况不可知,会导致 生产出现事故问题排查困难,以及线程池参数难以定义

文章围绕线程池监控展开,讨论 线程池如何监控、监控的指标以及监控数据的存储展示

线程池如何监控,才能帮助开发者快速定位线上错误?




01


如何监控运行数据



设想一下,如果想监控线程池的运行数据,你会怎么操作?这里提供两种常规思路

  1. 线程池运行时埋点,每一次运行任务都进行统计
  2. 定时获取线程池的运行数据

这里我推荐第二种,因为线程池的监控 API 会通过 获取主锁来控制结果的相对准确性,性能相对较差,后面会详细说明

为什么叫相对准确?因为任务和线程的状态在计算过程中可能会动态变化,只能给到一个近似值,保证不了绝对准确

模拟下定时采集线程池运行时数据的代码

// 缓冲队列
private BlockingQueue<Message> messageCollectVessel  = new ArrayBlockingQueue(bufferSize);

// 生产者
Message message = collector.collectMessage();
boolean offer = messageCollectVessel.offer(message);
if (!offer) {
    log.warn("Buffer data starts stacking data...");
}

// 消费者
while (true) {
    try {
        Message message = messageCollectVessel.take();
        messageSender.send(message);
    } catch (Throwable ex) {
        log.error("Consumption buffer container task failed. Number of buffer container tasks :: {}", messageCollectVessel.size(), ex);
    }
}

创建阻塞缓冲队列,由定时线程池采集历史运行数据,并放到缓冲队列中;然后起一个线程,循环消费即可

极端情况下缓冲队列元素会出现堆积,最新采集的线程池数据也就无法插入成功,为了不影响客户端的运行,仅做异常警告处理

使用最新抽象出来的客户端、服务端交互流程,有以下几个优点

  1. 数据的存储和查询展示由服务端提供功能,减轻客户端压力和重复工作量
  2. 历史运行数据的删除或备份操作由服务端统一执行
  3. 不同的项目不需要为线程池历史运行数据分别创建表结构存储
  4. 形成交互规范,避免业务发散单独开发,中心化的设计更利于技术的迭代和管理

监控图表展示 

不同公司对于线程池的监控不尽相同,出于各种考虑,会将监控封装成最符合自己业务场景的流程

Hippo4J 从最基本的指标出发,封装出了最小代价的监控体系,并提供可视化页面的图标展示

线程池如何监控,才能帮助开发者快速定位线上错误?

有兴趣可以查看 Hippo4J 框架官网介绍

Site:https://www.hippox.cn

还有一个功能点,考虑到很多公司搭建了一套监控体系,其中以 Prometheus + Grafana 为主

后续 Hippo4J 会接入 Prometheus,应用内部存储线程池的运行数据,适配 Prometheus 采集存储,最终展示到 Grafana




05


总结回顾



线程池作为企业级应用广泛的技术,对它的监控是不可或缺的稳定性保障之一

文章从线程池的监控出发,讲解了如何监控、监控的指标以及监控数据的存储,相信读者们也各有收获

看了上面的线程池监控内容,大家有什么想要补充的,在下方评论区留言

各位读者所在的公司又是如何对线程池监控,可以互相交流下心得


线程池如何监控,才能帮助开发者快速定位线上错误?

本篇文章来源于微信公众号: 龙台的技术笔记

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/10226.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!