巧用newSingleThreadExecutor让异步任务顺序跑

背景

Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统 。一个用来控制 Flume 采集任务的 Web 应用,需要对任务进行管理,主要操作「启动、停止、新建、编辑、删除」,本质就是对 Flume 进程进行管理。

任务控制流程:

  1. 任务启动:创建一个 Flume 进程。
  2. 任务停止:停止该 Flume 进程。
  3. 修改启动状态的任务:先停止正在执行的 Flume 进程、再创建一个 Flume 进程。
  4. 任务删除:启动状态的任务先停止 Flume 进程、再删除任务信息。

本文介绍近期对这个功能的优化操作:用 Executors.newSingleThreadExecutor() 单线程调度对任务的处理命令,保证异步任务能按页面提交的顺序顺次执行

不间断地 在 CSDN 写博客十多年了,CSDN 有流量没收益,转场掘金,有收益,没流量。本文首发掘金, 《掘金金石计划投稿》求赞!

旧逻辑

任务管理类是个单例,用了 ThreadPoolExecutor 线程池去调度 Flume 进程的操作。但是线程池没法保证任务的执行顺序,所以加了很多 awaitsleep 操作,等待任务执行完成后才返回响应结果给页面。

这个思路没问题,必要的等待可以保证后台的 Flume 进程按页面的操作指令执行,但用户体验很纠结。

异步任务管理过程中等待常量是 2秒,加上整个 Web 处理操作,以及 Controller 里面的 Sleep 操作,通过 Web 页面对 Flume 任务的管理操作响应时间平均 8 秒左右。

我在测试的时候编辑一个启用状态的任务,提交后需要心里默数到 20 才能看到页面操作结果,确实需要很大的耐心。现场也反馈过这个问题,怎么优化呢?

优化思路

既然都用异步了,为什么非要 awaitsleep 呢?最初思路是,直接去掉这些代码,页面响应果然很快,但是操作结果总是不合理。

  1. 停止、启动连续操作时,Flume 进程并没有启动:点击 「停止」操作,立即点「启动」,Flume 进程并没有起来。
  2. 编辑启动状态的任务:先停止、再启动操作,进程也没有启动。

这是因为线程池调度任务的是多线程的,而停止操作为了保证进程能被 kill 掉,它的逻辑是:

kill 进程ID
休眠 2 秒
再 kill -9

启动操作命令和停止操作一起的时候,最终启动的进程 2秒后又被 kill 掉了,所以直接去掉休眠操作不行。除了休眠等待,怎么保证线程池提按 Runnable 的提交顺序执行呢?

解决办法

更换线程池类型,用 Executors.newSingleThreadExecutor() 保证按提交顺序执行 Runnable;前端只管提交操作命令,后台调度时去掉所有的 await /sleep 等阻塞操作,立即返回响应结果给页面。

优化前,修改一个启动状态的任务,耗时 11 秒:
在这里插入图片描述
优化后,相同操作耗时 700 毫秒:
在这里插入图片描述

启示录

除了休眠等待,怎么保证线程池提按 Runnable 的提交顺序执行呢?我甚至尝试了去更改 flume-ng 脚本,启动任务之前先 kill 掉之前的任务,结果直接把刚刚启动的 flume 任务又给 kill 掉了。

后来想到了还是要在线程池的调度顺序上,如何让Java的线程池顺序执行任务?这不就是 newSingleThreadExecutor 嘛?

他强任他强,清风拂山冈;任他前端怎么点,单线程调度按序走!
不搭题,就是想到了这句话而已。

不间断地 在 CSDN 写博客十多年了,CSDN 有流量没收益,转场掘金,有收益,没流量。本文首发掘金, 《掘金金石计划投稿》求赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/739744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神经网络实战2-损失函数和反向传播

其实就是通过求偏导的方式,求出各个权重大小 loss函数是找最小值的,要求导,在计算机里面计算导数是倒着来的,所以叫反向传播。 import torch from torch.nn import L1Lossinputstorch.tensor([1,2,3],dtypetorch.float32) targe…

品牌策划背后的秘密:我为何对此工作情有独钟?

你是否曾有过一个梦想,一份热爱,让你毫不犹豫地投身于一个行业? 我就是这样一个对品牌策划充满热情的人。 从选择职业到现在,我一直在广告行业里“混迹”,一路走来,也见证了许多对品牌策划一知半解的求职…

RubyMine 2024 mac/win版:智慧编程,从心出发

JetBrains RubyMine 2024 是一款专为Ruby和Rails开发者打造的高效集成开发环境(IDE)。它凭借其卓越的性能和丰富的功能,帮助开发者在Ruby和Rails的开发过程中提升效率,减少错误。 RubyMine 2024 mac/win版获取 RubyMine 2024 提供了强大的代码编辑功能&…

mp4转换成mp3怎么转?教你几种值得收藏的转换方法!

mp4转换成mp3怎么转?MP4,这一深入人心的数字多媒体容器格式,无疑在当今数字世界中占据了一席之地,那么,它究竟有何过人之处呢?首先,MP4的跨平台兼容性是其一大亮点,不论是在Windows的…

免费的AI在线写作工具,让写作变的更简单

在如今的时代,写作已经成为了我们日常生活中不可或缺的一部分。无论是自媒体创作者、学生还是办公职场人员,都有内容创作的需求。然而,写作过程往往伴随着灵感枯竭、查找资料费时等问题。下面小编就来和大家分享几款免费的AI在线写作工具&…

cube studio开源一站式机器学习平台:k3s部署cube-studio

全栈工程师开发手册 (作者:栾鹏) 一站式云原生机器学习平台 前言 开源地址:https://github.com/tencentmusic/cube-studio cube studio 腾讯开源的国内最热门的一站式机器学习mlops/大模型训练平台,支持多租户&…

超级缓存神器:Memcached解密 - 加速你的网站速度

Memcached介绍和详解 1. 简介1.1 什么是Memcached1.2 Memcached的目标和特点1.3 Memcached的优势和适用场景 2. 架构和原理2.1 Memcached的客户端-服务器模型2.2 Memcached的内存存储结构2.3 Memcached的数据访问和数据存储流程2.3.1 数据访问流程2.3.2 数据存储流程 3. 安装和…

爆了!5个yyds的开源项目!

朋友们,今天我要来跟大家聊聊几个超级棒的开源项目,简直是yyds级别,绝对让你眼前一亮!美图镇楼~ 01. Motrix——全能下载管家 下载资源太麻烦?试试Motrix吧!这是一款功能强大的下载工具,支持HT…

湖南省物联网挑战赛教学平台使用说明文档

1物联网教学平台硬件连接 1.1硬件介绍 1)物联网教学平台实验箱 2)物联网硬件平台 3)无线传感器节点 4)智能烧录平台 1.2连线 注:智能烧录平台上的USB接口必须与物联网硬件平台“开关”那一面最右侧USB接口连接 1.3修…

【Sa-Token|4】Sa-Token微服务项目应用

若微服务数量多,如果每个服务都改动,工作量大,则可以只在网关和用户中心进行改动,也是可以实现服务之间的跳转。 这种方式可以通过在网关服务中生成和验证 Sa-Token,并将其与现有的 Token关联存储在 Redis 中。用户中心…

[Linux]缓冲区

一、概念 缓冲区,也称为缓存,是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,用来缓冲输入或输出的数据。这个保留的空间称为缓冲区。 缓冲区的主要作用就是提高效率: 提高使用者的效率&#xff0…

JAVA SDK 整合 AI 大语言模型

目前主流模型厂商的 SDK 并没有很好的支持 JAVA 环境,主流还是使用的 Python ,如果希望将 AI 功能集成到业务中来,则需要找找有没有一些现成的开源项目,但是这种项目一般需要谨慎使用,以防有偷取 app_key 等风险问题 前…

初阶 《操作符详解》 8. 逻辑操作符

8. 逻辑操作符 &&   逻辑与 ||   逻辑或 逻辑与和或的特点&#xff1a; &&左边为假&#xff0c;右边就不计算了 || 左边为真&#xff0c;右边就不计算了 例&#xff1a;360笔试题 #include <stdio.h> int main() {int i 0, a 0, b 2, c 3, d 4…

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因&#xff1a; 1.文件编码不一致&#xff1a;如果文件的编码方式与IDEA设置的编码方式不一致&#xff0c;就会产生乱码。确保文件和IDEA使用相同的编码&#xff0c;通常是UTF-8。2.IDEA设置问题&#xff1a;检查IDEA的全局编码设置和项目编码设置是否正确。3.终端…

Springboot整合Mongodb(含使用案例)

基础语法 插入 插入单条 // 插入一条数据到 "Books" 集合 db.Books.insertOne({title: "如何使用MongoDB",author: "IT小辉同学",year: 2023 })插入多条数据 // 插入十条数据到 "Books" 集合 db.Books.insertMany([{ title: "…

GitHub星标破千!斯坦福大学的284个机器学习小抄(漫画中文版)

说到人工智能必然要了解机器学习&#xff0c;从信息化软件&#xff0c;到电子商务&#xff0c;然后到高速发展互联网时代&#xff0c;到至今的云计算、大数据等&#xff0c;渗透到我们的生活、工作之中&#xff0c;在互联网的驱动下&#xff0c;人们更清晰的认识和使用数据&…

【事件总线】EventBus

文章目录 概述如何使用如何发布消息如何进行消息监听 来源 概述 事件总线是对发布-订阅模式&#xff08;观察者&#xff09;的一种实现&#xff0c;是一种集中式事件处理机制&#xff0c;允许不同的组件之间进行彼此通信而又不需要相互依赖&#xff0c;达到一种解耦的目的。 …

Maven下载安装、环境配置(超详细)(包括Windows、IDEA)

目录 一、引言 二、下载和安装 Maven &#xff08;1&#xff09;首先保证 Java 的环境是正常的。 1、电脑桌面上右击 " 此电脑 "&#xff0c;点击属性。 2、点击高级系统设置。 3、点击环境变量。 4、找到系统变量中的 Path。 5、点击新建&#xff0c;然后把…

Jmeter插件管理器,websocket协议,Jmeter连接数据库,测试报告的查看

目录 1、Jmeter插件管理器 1、Jmeter插件管理器用处&#xff1a;Jmeter发展并产生大量优秀的插件&#xff0c;比如取样器、性能监控的插件工具等。但要安装这些优秀的插件&#xff0c;需要先安装插件管理器。 2、插件的下载&#xff0c;从Availabale Plugins中选择&#xff…

论文翻译 | SELF-RAG: 学习通过自我反思来检索、生成和评估

Akari Asai, Zeqiu Wu, Yizhong Wang, Avirup Sil, Hannaneh Hajishirzi 华盛顿大学&#xff0c;IBM人工智能研究院 摘要 尽管大语言模型&#xff08;LLMs&#xff09;具有非凡的能力&#xff0c;但是它们经常产生不符合事实的响应&#xff0c;因为它们只依赖于它们封装的参数…