O pool de threads é usado dessa maneira, e os arquitetos o leram e disseram que é bom

Você encontrou os seguintes problemas ao usar o pool de threads em seu projeto?

  • Não é fácil avaliar os principais parâmetros de criação de um pool de threads.Com a flutuação do tráfego de negócios, é muito provável que ocorram falhas de produção.
  • O desligamento normal não é suportado e um grande número de tarefas do pool de encadeamentos em execução é descartado quando o projeto é fechado.
  • Não suporta monitoramento em tempo de execução e o negócio não responde durante o uso, não sei se é causado pelo pool de threads.
  • Os pools de encadeamentos, como as estruturas de terceiros RocketMQ e Dubbo, não podem modificar parâmetros dinamicamente e o aplicativo só pode ser reiniciado após a modificação.

Em cenários de negócios reais, o pool de threads pode encontrar mais problemas do que os descritos aqui, que são estranhos.

Nos projetos que experimentei, vários acidentes de produção foram acionados porque o negócio não configurou os parâmetros do pool de threads de maneira razoável. Por volta de 21 de junho, comecei a pesquisar projetos de pool de threads dinâmicos na Internet.

Encontrei muitos projetos de pool de threads dinâmicos na plataforma de código aberto.Em termos de funcionalidade e robustez, pessoalmente sinto que eles não estão satisfeitos com aplicativos de nível empresarial.

Como estou mais interessado no pool de encadeamentos dinâmicos e quero escrever um projeto significativo, decidi construir sozinho uma roda leve.

GitHub: github.com/opengoofy/h…

Gitee: gitee.com/opengoofy/h…

Funções do núcleo

Por meio do aprimoramento do conjunto de encadeamentos JDK e da expansão do conjunto de encadeamentos subjacente da estrutura tripartida, ele melhora a capacidade de garantia de operação on-line para o sistema de negócios.

A estrutura Hippo4j fornece suporte para os seguintes recursos:

  • Controle Global - Gerencie todas as instâncias do pool de threads de aplicativos cliente.
  • Alteração dinâmica - altera dinamicamente os parâmetros principais do pool de encadeamentos quando o aplicativo está em execução.
  • Alarme de notificação - várias estratégias integradas de notificação de alarme, atividade do pool de threads, nível de água da capacidade, estratégia de rejeição e tempo de execução da tarefa muito longo.
  • Coleta de dados - oferece suporte a várias maneiras de coletar dados do pool de encadeamentos, incluindo, entre outros: logs, coleta integrada, Prometheus, InfluxDB, ElasticSearch, etc.
  • Monitoramento de operação - visualize os dados de tempo de execução do pool de threads em tempo real e exiba o gráfico de dados de operação do pool de threads em um horário personalizado.
  • Extensão de função - suporte ao contexto de transferência de tarefas do pool de threads; quando o projeto é fechado, ele suporta a espera do pool de threads para concluir a tarefa dentro do tempo especificado.
  • 多种模式 - 内置两种使用模式:依赖配置中心无中间件依赖
  • 容器管理 - 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. Princípio de alteração do modo do centro de configuração

2. Adapte-se ao SpringBoot 1.5 e 2.x

3. O princípio subjacente

Caso sua empresa não utilize o cenário Hippo4j, recomendo também a leitura dos princípios subjacentes ao projeto, principalmente pelos seguintes motivos:

  • Para melhorar a qualidade do código e o comportamento de expansão subsequente, vários padrões de projeto são usados ​​para obter alta coesão e baixo acoplamento.
  • A camada inferior da estrutura depende da estrutura do Spring para executar e usa muitas funções relacionadas ao Spring no código-fonte.
  • Use uma variedade de ferramentas no pacote de simultaneidade JUC para garantir a segurança da operação multiencadeada e entender a programação simultânea por meio de cenários reais.
  • Aprenda com as principais estruturas de software livre Nacos e Eureka para realizar as funções de centro de configuração leve e centro de registro.
  • Personalize a implementação da estrutura RPC, encapsule o Netty para concluir a otimização da comunicação de rede cliente/servidor.
  • Padronize a escrita de código por meio de plug-ins como CheckStyle e Spotless para garantir comportamento e estilo de código de alta qualidade.

resumo final

O Hippo4j é um framework dinâmico de pool de threads na comunidade de código aberto OpenGoofy. Ele tem mais de 32 empresas com experiência de produção real e experimentou o teste de centenas de aplicativos conectados a um único nó.

Ele é de código aberto há quase dois anos. Durante esse período, 17 versões de lançamento foram lançadas. Um total de mais de 32 empresas o implantaram e o usaram na produção. Eles coletaram Star 4.8k, 10 principais colaboradores Committer e 100 colaboradores Contributor.

GitHub: github.com/opengoofy/h…

Gitee: gitee.com/opengoofy/h…

Acho que você gosta

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