项目中遇到的问题总结(六)

news2024/11/25 23:40:59

什么是分布式任务调度

分布式任务调度是指将一个大型任务拆分成多个较小的子任务,并在多台计算机上并行执行这些子任务的过程。在这个过程中,需要一个分布式任务调度系统来协调和管理每个子任务的调度和执行。分布式任务调度系统通常具有以下特点:

  1. 高可用性:当某个计算节点出现故障时,可以将任务重新分配给其他计算节点执行,以保证任务可以按时完成。

  2. 可扩展性:可以轻松地添加或删除节点,以满足处理不同规模任务的需求。

  3. 高效性:可以根据任务的特点和实际情况动态地调整任务的切分和分配方式,以达到更好的任务执行效率。

分布式任务调度系统通常运行在一个集群环境中,同时利用各个计算节点的计算能力来加速任务执行的速度,并且保证任务的可靠性和稳定性。常见的分布式任务调度系统包括Apache Hadoop中的YARN、Apache Spark中的Cluster Manager等。

分布式调度要实现的目标

不管是任务调度程序集成在应用程序中,还是单独构建的任务调度系统,如果采用分布式调度任务的方式就相当于将任务调度程序分布式构建,这样就可以具有分布式系统的特点,并且提高任务的调度处理能力:

1、并行任务调度
并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。
如果将任务调度程序分布式部署,每个结点还可以部署为集群,这样就可以让多台计算机共同去完成任务调度,我们可以将任务分割为若干个分片,由不同的实例并行执行,来提高任务调度的处理效率。

2、高可用
若某一个实例宕机,不影响其他实例来执行任务。

3、弹性扩容
当集群中增加实例就可以提高并执行任务的处理效率。

4、任务管理与监测
对系统中存在的所有定时任务进行统一的管理及监测。让开发人员及运维人员能够时刻了解任务执行情况,从而做出快速的应急处理响应。

5、避免任务重复执行
当任务调度以集群方式部署,同一个任务调度可能会执行多次,比如在上面提到的电商系统中到点发优惠券的例子,就会发放多次优惠券,对公司造成很多损失,所以我们需要控制相同的任务在多个运行实例上只执行一次。

XXL-JOB

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

官网
文档

XXL-JOB主要有调度中心、执行器、任务:
在这里插入图片描述

调度中心:
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码;
主要职责为执行器管理、任务管理、监控运维、日志管理等
任务执行器:
负责接收调度请求并执行任务逻辑;
只要职责是注册服务、任务执行服务(接收到任务后会放入线程池中的任务队列)、执行结果上报、日志服务等
任务:负责执行具体的业务处理。

调度中心与执行器之间的工作流程如下:

在这里插入图片描述

执行流程:

    1. 任务执行器根据配置的调度中心的地址,自动注册到调度中心
    2. 达到任务触发条件,调度中心下发任务
    3. 执行器基于线程池执行任务,并把执行结果放入内存队列中、把执行日志写入日志文件中
    4. 执行器消费内存队列中的执行结果,主动上报给调度中心
    5. 当用户在调度中心查看任务日志,调度中心请求任务执行器,任务执行器读取任务日志文件并返回日志详情

什么是模板引擎

模板引擎是一种在Web应用程序中用于生成动态HTML页面的工具。简单来说,它们是将数据和模板混合在一起,以生成HTML的软件组件。模板引擎用来减少页面和代码之间的重复性,以及在服务器端和客户端之间细化数据的传递方式。

在模板引擎中,我们可以使用一系列的语法和控制结构,来生成具有可变内容的HTML页面。最常用的一种语法是变量替换,例如我们可以定义一个变量,并在HTML页面中插入该变量,这样我们可以根据数据的不同动态生成不同的页面。除了变量替换,一些模板引擎还支持循环、条件语句、过滤器等功能,可以更加灵活地控制模板的输出。

常见的模板引擎有很多种,例如Jinja2、mustache、Handlebars、Pug等等。不同的模板引擎具有不同的语法和特性,开发者可以根据自己的需求和喜好来选择合适的模板引擎。

早期我们采用的jsp技术就是一种模板引擎技术,如下图:

在这里插入图片描述

1、浏览器请求web服务器
2、服务器渲染页面,渲染的过程就是向jsp页面(模板)内填充数据(模型)。
3、服务器将渲染生成的页面返回给浏览器。
所以模板引擎就是:模板+数据=输出,Jsp页面就是模板,页面中嵌入的jsp标签就是数据,两者相结合输出html网页。

常用的java模板引擎还有哪些?

Jsp、Freemarker、Thymeleaf 、Velocity 等。

什么是页面静态化?

课程预览功能通过模板引擎技术在页面模板中填充数据,生成html页面,这个过程是当客户端请求服务器时服务器才开始渲染生成html页面,最后响应给浏览器,服务端渲染的并发能力是有限的。

页面静态化则强调将生成html页面的过程提前,提前使用模板引擎技术生成html页面,当客户端请求时直接请求html页面,由于是静态页面可以使用nginx、apache等高性能的web服务器,并发性能高。

什么时候能用页面静态化技术?

当数据变化不频繁,一旦生成静态页面很长一段时间内很少变化,此时可以使用页面静态化。因为如果数据变化频繁,一旦改变就需要重新生成静态页面,导致维护静态页面的工作量很大。

根据课程发布的业务需求,虽然课程发布后仍可以修改课程信息,但需要经过课程审核,且修改频度不大,所以适合使用页面静态化。

ThreadPoolTaskExecutor

ThreadPoolTaskExecutor 是 Spring 中的一个线程池管理器,提供了对 Java 线程池的封装和扩展功能。功能强大,使用方便,是异步处理、任务调度等场景下的一个很好的选择。

ThreadPoolTaskExecutor 主要提供以下功能:

  1. 线程池的创建和配置:可以通过 setCorePoolSize、setMaxPoolSize、setKeepAliveSeconds 等方法,灵活地配置线程池的基本属性,例如线程池大小、线程池类型(固定大小或者弹性大小)、线程存活时间、队列容量等。

  2. 线程池的调度和管理:通过 execute、submit 等方法,可以向线程池提交任务。对于一些不满足执行条件的任务,如线程池已满、队列已满等,可以通过拒绝策略 RejectedExecutionHandler 处理。ThreadPoolTaskExecutor 提供了四种默认的拒绝策略,分别是 AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy 和 DiscardPolicy。

  3. 多线程并发处理:ThreadPoolTaskExecutor 可以有效地进行多线程并发处理,提高程序的响应速度和处理能力。通过 setTaskExecutor、setWaitForTasksToCompleteOnShutdown 方法可以对多线程任务进行管理和控制。

ThreadPoolTaskExecutor 深度集成了 Spring 的其他组件,以支持 Spring 的异步任务执行、任务调度等功能,并提供了比较完整的可扩展性和重载方法,可以定制化地实现自定义的线程池调度和管理。

在编写多线程程序时,通常我们应该尽量利用 ThreadPoolTaskExecutor 这样的线程池工具类,来优化线程池性能并简化线程池操作。

ThreadPoolTaskExecutor 和 ThreadPoolExecutor比较

ThreadPoolTaskExecutor 和 ThreadPoolExecutor 都是 Java 中的线程池实现,它们之间有以下几点区别:

  1. 抽象程度不同: ThreadPoolExecutor 是 Java 标准库提供的线程池实现,而 ThreadPoolTaskExecutor 则是 Spring 框架封装的线程池实现,它在 ThreadPoolExecutor 的基础上做了更高层次的抽象,简化了线程池的配置和管理。

  2. 功能扩展不同:ThreadPoolTaskExecutor 相比 ThreadPoolExecutor,在任务调度和管理上做了更多的扩展,提供了更多的方便实用的方法供编程者使用。例如,ThreadPoolTaskExecutor 提供了线程池关闭等待任务结束的方法 setWaitForTasksToCompleteOnShutdown,提供了默认的拒绝执行策略,支持异步执行和任务调度等。

  3. 实例化方式不同:ThreadPoolExecutor 对象可以直接通过 new 关键字进行实例化,而 ThreadPoolTaskExecutor 是 Spring 容器中的一个 Bean,需要在 Spring 配置文件中进行声明和注入。ThreadPoolTaskExecutor 是一个 Spring 管理的单例 Bean,可以通过注入方式在不同程序组件之间共享,提高了线程池的可用性和可重用性。

  4. 配置方式不同:ThreadPoolExecutor 需要通过 new 关键字手动创建并配置线程池中的各种参数,ThreadPoolTaskExecutor 则提供了更加面向接口的可扩展配置方式,支持通过配置 Bean 属性和设置回调函数来实现配置的灵活和扩展。

综上所述,ThreadPoolTaskExecutor 更适合在 Spring 环境下使用,可以方便地与 Spring 的其他组件集成,简化多线程编程的复杂度和提高代码的可读性、可维护性。而 ThreadPoolExecutor 则更适合在 Java 标准库中使用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux教程——什么是Vim,Vim及其安装

我们知道,Linux 系统中“一切皆文件”,因此当我们在命令行下更改文件内容时,不可避免地要用到文本编辑器。 作为一名 Linux 初学者,你必须熟练掌握 Linux 中至少一款文本编辑器的用法。对文本编辑器的功能(如查找、剪…

图书馆大数据分析系统,图书馆大数据管理平台

图书馆是每个学校的标配,随着科技的发展,智慧图书馆也越来越开始普及,大数据分析也进而走到图书馆的建设中,为图书馆建设发挥着重要的作用。 图书馆大数据分析系统能够帮助图书馆进行数据分析,可以更好的优化资源配置…

跟着 Nature 学作图 | 相关性热图(显示相关性散点图)

corr 本期图片 ❝ Jiang, Y., Sun, A., Zhao, Y. et al. Proteomics identifies new therapeutic targets of early-stage hepatocellular carcinoma. Nature 「567」, 257–261 (2019). https://doi.org/10.1038/s41586-019-0987-8 ❞ 复现结果 image-20230615220659639 示例数…

紧随时代脚步,一览直播数据

第一为什么直播间要去做复盘?主要是为了找对做直播内容的方向,少走弯路,通过复盘来找出问题,进一步分析问题、解决问题,同时及时调整运营策略。 第二从哪里查看数据?可以通过什么样的平台去查看直播间的数据…

让天下没有难Tuning的大模型-PEFT(参数效率微调)技术简介

​ https://www.yuque.com/meta95/hmc3l4/ozgy13dx4akv7v17?singleDoc# 《让天下没有难Tuning的大模型-PEFT技术简介》 最近,深度学习的研究中出现了许多大型预训练模型,例如GPT-3、BERT等,这些模型可以在多种自然语言处理任务中取得优异的…

C++类和对象(多态)

4.7多态 4.7.1多态的基本概念 多态是C面向对象三大特性之一 多态分为两类 静态多态:函数重载和运算符重载属于静态多态,复用函数名。动态多态:派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑…

SpringBoot 如何使用 Tomcat 容器

SpringBoot 如何使用 Tomcat 容器 SpringBoot 是一种基于 Spring 框架的快速开发框架,它提供了许多功能和组件,其中包括了内置的 Tomcat 容器。在本文中,我们将介绍如何使用 SpringBoot 内置的 Tomcat 容器来运行 Web 应用程序。 SpringBoot…

ubuntu 18.04系统python3.6 升级到 python3.9

1.安装依赖库 sudo apt-get install build-essential libbz2-dev libssl-dev libreadline-dev libsqlite3-dev 2.下载 Python 3.9 源代码 wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz # 解压 tar -xf Python-3.9.5.tar.xz 3.编译Python 3.9 cd Pytho…

Grounded-Segment-Anything本地部署

Grounded-Segment-Anything本地部署 1.本地部署源码1.1 克隆源码1.2 下载初始参数 2. 创建虚拟环境及配置3. 测试相关文件3.1 运行grounding_dino_demo.py文件3.2 运行grounded_sam_demo.py文件3.3 运行grounded_sam_simple_demo.py文件3.4 grounded_sam_inpainting_demo.py文件…

Spring Boot 如何使用 Jetty 容器

Spring Boot 如何使用 Jetty 容器 Jetty 是一款轻量级的 Java Web 容器,适用于各种规模的 Web 应用程序。在 Spring Boot 中,我们可以使用 Jetty 作为 Web 容器来处理 HTTP 请求和响应。本文将介绍 Spring Boot 如何使用 Jetty 容器,包括如何…

SpringBoot 如何使用 AOP 容器

SpringBoot 如何使用 AOP 容器 SpringBoot 是基于 Spring Framework 的一种快速开发框架,它提供了丰富的功能和组件,其中之一就是 AOP(面向切面编程)。AOP 是一种编程范式,可以将横向关注点(如日志记录、事…

紫东太初:造一个国产大模型,需用多少篇高质量论文?

原创:谭婧 “视觉自监督算法这轮,你是不是没跟上?” 我面前这位年薪近七十万,互联网大厂AI算法工程师的好友, 他用一个反问句回答了我的关心: “自监督这个玩意咋跟上?” 他抬了抬头&#xff0c…

shell 拼接字符串,出现后面的字符串覆盖前面的字符串问题

字符串拼接语法 shell 拼接字符串语法很简单两个参数并排前后写上接口,如下 str1www str2bbb s t r 1 str1 str1str2 的结果未 wwwbbb 有时会出现如下问题: 在拼接字符串的时候,后面的字符串将前面的字符串覆盖了。 一、问题描述 shell的…

Unity3D:Game 视图

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 Game 视图 从应用程序中的摄像机渲染 Game 视图。 该视图代表最终发布的应用程序。 需要使用一个或多个摄像机来控制玩家在使用应用程序时看到的内容。 有关摄像机的更多信息&#…

Github调研:开发者对生产力、协作和AI编码工具的看法

Datawhale干货 翻译:段秋阳 Datawhale成员 调研背景 GitHub首席产品官Inbal Shani如是说: 今天的开发人员所做的不仅仅是编写和发布代码,他们还需要熟练应用各种工具、环境和技术,包括生成人工智能编码工具这个新领域。但对开发人…

Python基础(14)——Python元组(tuple)详解

Python基础(14)——Python元组(tuple)详解 文章目录 Python基础(14)——Python元组(tuple)详解课程:元组目标一. 元组的应用场景二. 定义元组三. 元组的常见操作四. 总结…

vue进阶-vue-route

Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。 本章只做学习记录,详尽的内容一定要去官网查看api文档 Vue Router-Vue.js 的官方路由 1. 路由的基本使用 1.1 安装vue-router npm install vue-…

图解transformer中的自注意力机制

本文将将介绍注意力的概念从何而来,它是如何工作的以及它的简单的实现。 注意力机制 在整个注意力过程中,模型会学习了三个权重:查询、键和值。查询、键和值的思想来源于信息检索系统。所以我们先理解数据库查询的思想。 假设有一个数据库&#xff0c…

Django-带参数的路由编写(二)【用正则表达式匹配复杂路由】

在上一篇博文中,学习了“不用正则表达式匹配的简单带参数路由”,详情见链接: https://blog.csdn.net/wenhao_ir/article/details/131225388 本篇博文学习用“用正则表达式匹配复杂路由”。 简单的参数路由用库django.urls中的函数path()就可…

内涝监测系统如何助力城市防洪抗涝

近年来,各地内涝问题愈发严重,强降雨天气导致城市内涝已经屡见不鲜了,城市内涝不仅影响城市交通、居民生活,还可能对建筑物和基础设施造成损害,给城市运行带来重大风险。内涝治理除了要解决城市“里子”问题&#xff0…