쓰레드풀은 이런식으로 쓰는데 아키텍트들이 읽어보고 좋다고 하더라

프로젝트에서 스레드 풀을 사용할 때 다음과 같은 문제가 발생했습니까?

  • 스레드 풀 생성의 핵심 매개 변수를 평가하는 것은 쉽지 않으며 비즈니스 트래픽의 변동으로 인해 생산 실패가 발생할 가능성이 높습니다.
  • 정상적인 종료는 지원되지 않으며 프로젝트가 닫히면 실행 중인 많은 수의 스레드 풀 작업이 삭제됩니다.
  • 런타임 모니터링을 지원하지 않고, 사용 중 기업이 응답하지 않는데, 쓰레드풀 때문인지는 모르겠습니다.
  • 타사 프레임워크인 RocketMQ 및 Dubbo와 같은 스레드 풀은 매개변수를 동적으로 수정할 수 없으며 애플리케이션은 수정 후에만 다시 시작할 수 있습니다.

실제 비즈니스 시나리오에서 스레드 풀은 여기에 설명된 것보다 더 많은 문제에 직면할 수 있습니다.

내가 경험한 프로젝트에서 기업이 스레드 풀 매개 변수를 합리적으로 구성하지 않아 여러 생산 사고가 발생했습니다. 6월 21일경에 인터넷에서 동적 스레드 풀 프로젝트를 검색하기 시작했습니다.

오픈 소스 플랫폼에서 동적 스레드 풀 프로젝트를 많이 찾았는데, 기능과 견고성 측면에서 엔터프라이즈급 애플리케이션에 만족하지 못한다는 느낌이 개인적으로 듭니다.

다이내믹 스레드 풀에 더 관심이 있고 의미 있는 프로젝트를 작성하고 싶어서 경량 휠을 직접 제작하기로 했습니다.

GitHub: github.com/opengoofy/h…

기티: gitee.com/opengoofy/h…

핵심 기능

JDK 스레드 풀의 향상과 3자 프레임워크의 기본 스레드 풀 확장을 통해 비즈니스 시스템의 온라인 운영 보장 기능을 향상시킵니다.

Hippo4j 프레임워크는 다음 기능을 지원합니다.

  • 전역 제어 - 클라이언트 응용 프로그램의 모든 스레드 풀 인스턴스를 관리합니다.
  • 동적 변경 - 애플리케이션이 실행 중일 때 스레드 풀의 핵심 매개변수를 동적으로 변경합니다.
  • 알림 알람 - 내장된 다중 알람 알림 전략, 스레드 풀 활동, 용량 수위, 거부 전략 및 작업 실행 시간이 너무 깁니다.
  • 데이터 수집 - 로그, 내장 수집, Prometheus, InfluxDB, ElasticSearch 등을 포함하되 이에 국한되지 않는 스레드 풀 데이터를 수집하는 여러 가지 방법을 지원합니다.
  • 작업 모니터링 - 스레드 풀의 런타임 데이터를 실시간으로 보고 사용자 지정 시간 내에 스레드 풀 작업 데이터 차트를 표시합니다.
  • 기능 확장 - 스레드 풀 작업 전송 컨텍스트 지원, 프로젝트가 닫힐 때 스레드 풀이 지정된 시간 내에 작업을 완료하기를 기다리는 것을 지원합니다.
  • 多种模式 - 内置两种使用模式:依赖配置中心无中间件依赖
  • 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。
  • 框架适配 - Dubbo、Hystrix、Kafka、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。
  • 变更审核 - 提供多种用户角色,普通用户变更线程池参数需要 Admin 用户审核方可生效。
  • 动态化插件 - 内置多种线程池插件,支持用户自定义插件以及运行时扩展。
  • 多版本适配 - 经过实际测试,已支持客户端 SpringBoot 1.5.x => 2.7.5 版本(更高版本未测试)。

应用场景

1. 动态调参

业务中使用了线程池,大部分程序员可能都在犯嘀咕,这线程池的配置应该如何选择?

我觉得犯纠结的点主要有两个,无外乎设置的线程数多了或者少了。

  • 如果预设的线程数或阻塞队列数量少了,当业务量上来,任务都在排队或者执行拒绝策略。
  • 如果超量设置线程池的参数,无疑会造成资源浪费。

如果要修改运行中应用线程池参数,需要停止线上应用,调整成功后再发布,而这个过程异常的繁琐,如果能在运行中动态调整线程池的参数无疑会提高问题解决效率。

如果应用是集群部署,Hippo4j 可以选择修改线程池 某一实例,或者修改集群全部实例,运行时生效,不需要再重启服务。

压测时可以使用 Hippo4j 动态调整线程池参数,判断线程池核心参数设置是否合理。对于开发测试来说,如果不满足可以随时调整。

2. 告警策略

从线程池运行时监控的角度出发,hippo4j 内置 4 种报警策略,线程池活跃度、阻塞队列容量、拒绝策略触发以及任务运行超时报警。

  • 线程池活跃度:假设阈值设置 80%,线程池最大线程数 10,当线程数达到 8 发起报警。
  • 阻塞队列容量:假设阈值设置 80%,阻塞队列容量 100,当容量达到 80 发起报警。
  • 触发拒绝策略:当线程池任务触发了拒绝策略时,发起拒绝策略报警。
  • 任务运行超时:假设单个任务超时为 1000ms,任务执行超过该时间发起报警。

Hippo4j 支持钉钉、企业微信和飞书软件通知,线程池任务运行超时报警示例:

3. 线程池监控

Hippo4j 内部提供了两种监控方式:线程池核心参数监控以及线程池实例运行时状态检查。

1)线程池核心参数监控。

2)线程池实例运行时状态。

通过两种监控方式,可以方便快捷掌握线程池运行时的数据状态,可以用作健康巡查以及历史问题复盘。

4. 中间件线程池

Hippo4j 的目标是兼容所有中间件的线程池,并可以提供监控和动态修改的能力。

Q:为什么要适配这些中间件框架的线程池?

A:相信这是很多小伙伴的疑问。以 Dubbo 举例,因为当服务高并发调用时,如果 Dubbo 底层线程池没有经过个性化配置,极有可能导致线程池打满,最终导致无法提供服务。

当遇到这种情况,可以使用 Hippo4j 对 Dubbo 线程池进行核心参数调整,避免生产故障时间持续。

目前 Hippo4j 已支持的三方中间件线程池列表:

  • Apache Dubbo
  • Alibaba Dubbo
  • RabbitMQ
  • Apache RocketMQ
  • SpringCloud Stream RocketMQ
  • SpringCloud Hystrix
  • Tomcat
  • Jetty
  • Undertow

上述中间件线程池都可以在 Hippo4j 页面上操作核心参数动态变更以及监控功能,如下所示:

未来 Hippo4j 会支持更多三方框架线程池,如果你有好的想法也可以和我沟通。

模块说明

深入原理

如果一上来就下载 Hippo4j 的源码来看,很容易迷失进去。这里给大家画了几张图,帮助大家在阅读源码时,能够抓紧主干分支,更快上手 Hippo4j 框架源码。

1. 구성 센터 모드 변경 원리

2. SpringBoot 1.5 및 2.x에 적응

3. 기본 원칙

회사에서 Hippo4j 시나리오를 사용하지 않는 경우 주로 다음과 같은 이유로 프로젝트의 기본 원칙을 읽는 것이 좋습니다.

  • 코드 품질과 후속 확장 동작을 개선하기 위해 다양한 디자인 패턴을 사용하여 높은 응집력과 낮은 결합성을 달성합니다.
  • 프레임워크의 최하위 계층은 Spring 프레임워크에 의존하여 실행되며 소스 코드에서 Spring 관련 함수를 많이 사용합니다.
  • JUC 동시성 패키지의 다양한 도구를 사용하여 다중 스레드 작업의 안전성을 보장하고 실제 시나리오를 통해 동시 프로그래밍을 이해합니다.
  • 주류 오픈 소스 프레임워크인 Nacos 및 Eureka에서 학습하여 경량 구성 센터 및 등록 센터의 기능을 실현하십시오.
  • RPC 프레임워크 구현을 사용자 지정하고 Netty를 캡슐화하여 클라이언트/서버 네트워크 통신 최적화를 완료합니다.
  • CheckStyle 및 Spotless와 같은 플러그인을 통해 코드 작성을 표준화하여 고품질 코드 동작 및 코드 스타일을 보장합니다.

최종 요약

Hippo4j는 OpenGoofy 오픈 소스 커뮤니티의 동적 스레드 풀 프레임워크로, 32개 이상의 회사의 실제 프로덕션 경험이 있으며 단일 노드에 연결된 수백 개의 애플리케이션 테스트를 경험했습니다.

거의 2년 동안 오픈 소스로 운영되었으며, 이 기간 동안 17개의 릴리스 버전이 출시되었습니다.

GitHub: github.com/opengoofy/h…

기티: gitee.com/opengoofy/h…

Supongo que te gusta

Origin juejin.im/post/7215247106343534649
Recomendado
Clasificación