系统设计面试指南之分布式任务调度

这篇具有很好参考价值的文章主要介绍了系统设计面试指南之分布式任务调度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 简介

任务是需要资源(CPU 时间、内存、存储、网络带宽等)在指定时间内完成的一段计算工作。

通过智能地将资源分配给任务以满足任务级和系统级目标的系统称为任务调度程序。

任务调度程序:

系统设计面试指南之分布式任务调度

及时决定和分配资源给任务的过程称为任务调度。

当我们在 Facebook 发表评论时。我们不会让评论发布者等待直到那条评论被交付给所有关注者。交付被委托给一个异步任务调度程序离线完成。

在分布式系统中,许多任务是在用户的单个请求的背景下运行。考虑Facebook、WhatsApp 或 Instagram 这样的热门系统有数亿用户。这些系统需要一个任务调度程序来处理数十亿个任务。Facebook 使用 Async 根据其用户的数十亿个并行异步请求来调度其所有任务。

Async 是 Facebook 自己的分布式任务调度程序,调度其所有任务。一些任务时间敏感,如应该运行的通知用户某项活动开始直播的任务。如果用户在直播结束后才收到通知就没意义了。某些任务可延迟,如向用户提出好友建议的任务。Async 根据适当的优先级调度任务。

2 需求

  • 可用性:系统应高可用以调度和执行任务
  • 持久性:系统收到的任务应持久化,不应丢失
  • 可扩展性:系统应能每天调度和执行越来越多的任务
  • 有限的等待时间:这是任务在开始执行之前需要等待的时间。我们不能在预期时间之后执行任务。用户不应该无限期地等待。如果用户的等待时间超过一定阈值,他们应该收到通知

3 组件设计

3.1 任务调度程序架构设计

系统设计面试指南之分布式任务调度

① Task Submitter(任务提交者)

接受任务。没有单一的任务提交者。相反,我们有一组接收越来越多任务的节点。

② Database(数据库)

任务提交者接收的所有任务都存储在分布式数据库。使用关系数据库来存储:

  • task IDs
  • user IDs
  • 所需资源
  • 执行上限
  • 客户端尝试总次数
  • 延迟容忍度
  • ...

使用有向无环图(DAG)存储依赖任务的数据的图数据结构的非关系数据库。

③ Batching and prioritization(批处理和优先级)

将任务存储在 RDB 后,将任务分批。优先级基于任务的属性,如:

  • 延迟容忍度
  • 或执行时间短的任务等。

将最高 K 优先级的任务推送到分布式队列,K限制可以推送到队列的元素数量。K值取决许多因素,如:

  • 当前可用资源
  • 客户端
  • 或任务优先级
  • 订阅级别

④ Queue manager(队列管理器)

队列管理器在队列中添加、更新或删除任务。它跟踪我们使用的队列的类型。它还负责保持任务在队列中直到成功执行。如果任务执行失败,该任务将再次出现在队列。队列管理器知道在高峰时段、非高峰时段应该运行什么队列。

⑤ Resource manager(资源管理器)

知道哪些资源空闲。它从分布式队列中拉取任务并分配给它们资源。资源管理器:

  • 跟踪每个任务的执行情况
  • 并将其状态发送回队列管理器

若任务超出其能力或所需的资源使用,则终止该任务,并将状态发送回任务提交者,后者将通过错误消息通知客户端有关任务终止的情况。

4 执行上限

4.1 任务分类

  • 不能延迟的任务 - 紧急任务
  • 可延迟的任务
  • 需定期执行的任务 - 周期性任务

基于任务类别的多个队列:

系统设计面试指南之分布式任务调度

系统需确保非紧急队列中的任务不会被饿死。一旦某些任务的延迟限制即将达到,它就会被移动到紧急任务队列以获得优先服务。

4.2 优先级

一些任务执行时间很长并占用资源,阻塞其他任务。在调度任务时,执行上限(execution cap)是个重要参数。

若我们完全分配资源给单个任务并等待该任务完成,则由于任务脚本错误,某些任务可能不会停止,无法完成执行。我们允许用户为其任务设置执行上限。指定时间后停止任务执行,释放资源并分配给队列中的下一任务。若由于执行上限而停止任务执行,系统会通知所属用户的这些实例。他们需针对这种情况采取人工兜底。

5 任务紧急执行

有些任务需紧急执行。如Facebook社交应用中,用户可在紧急情况下标记自己是安全的,如地震。执行此活动的任务应及时执行,否则此功能对 Facebook 用户毫无用处。向客户发送电子邮件通知,告知其账户扣除一定金额的资金,是另一个需要紧急执行的任务示例。

为优先处理任务,任务调度程序为每个任务维护一个delay tolerance(延迟容忍度)参数,并在接近其延迟容忍度时执行该任务。

延迟容忍度是任务执行可延迟的最大时间量。首先执行延迟容忍时间最短的任务。通过使用延迟容忍参数,可在高峰时段推迟延迟容忍值更长的任务,为紧急任务留出空间。

6 资源容量优化

有时资源接近过载阈值(如超过 80% 利用率),这就是高峰期。同一资源在非高峰时段可能闲置。所以,须考虑如何在非高峰时段更好利用资源及如何在高峰时段保持资源可用。

有些任务无需紧急执行。如Facebook社交应用,建议好友不是紧急任务。可以为这样的任务创建一个单独的队列,并在非高峰时段执行它们。如果我们一直有比可用资源更多的工作要做,我们可能会遇到容量问题,就该配置更多资源。

7 任务幂等性

如果任务成功执行,但由于某些原因机器无法发送确认,则调度程序将再次调度该任务。再次执行该任务。

我们不希望再次执行任务时最终结果发生更改。这在转账时对金融应用程序至关重要。我们要求任务是幂等的。幂等任务无论执行多少次都会产生相同的结果。

此属性是由开发人员在实现中添加的,通过某些内容(例如名称)来标识该属性并覆盖旧的。

8 评估

8.1 可用性

任务提交是由多个节点完成的。若提交任务的节点失败,其他节点将接替其位置。推送任务的队列在本质上也是分布式,确保可用性。由于持续监控是否需要添加或删除资源,可尽力保证始终有可用资源。设计中的每个组件都是分布式的,使得整个系统可用性大大增强。

8.2 持久性

我们将任务存储在持久化分布式数据库中,并在接近执行时间时将任务推送到队列中。一旦提交任务,它就会在数据库中直到执行完成。

8.3 可扩展性

任务调度程序提供可扩展性,因为设计中任务提交者是分布式的。可向集群添加更多节点以提交大规模数量的任务。

然后将这些任务保存到也是可扩展的分布式关系数据库中。

再从 RDB 将任务推送到分布式队列,它可随任务数量增加而扩展。可为不同类型的任务添加更多队列。还可根据资源与需求比添加更多资源。

8.4 容错性

任务在首次发送执行时不会从队列中删除。如果执行失败,将尝试最大允许次数的重试。若任务包含死循环,会在指定时间后终止任务并通知用户。

参考:

  • 编程严选网

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-747811.html

到了这里,关于系统设计面试指南之分布式任务调度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何本地搭建开源分布式任务调度系统DolphinScheduler并远程访问

    本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问,结合内网穿透工具实现公网访问DolphinScheduler内网并进行远程办公,帮助开发人员进行远程任务调度及管理,提高工作效率。 DolphinScheduler是一款开源的分布式任务调度系统,它可以帮助开发人员更加方

    2024年02月05日
    浏览(49)
  • Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)

    xxl-job 是一个分布式任务调度平台,它提供了强大的任务调度和执行能力,可以帮助我们实现任务的自动化调度和执行。本文将介绍如何在 Docker 环境下部署 xxl-job,并将其与 Spring Boot 进行整合。 数据库脚本:tables_xxl_job-2.4.0.sql Docker 镜像地址: https://hub.docker.com/r/xuxueli/xxl-jo

    2024年02月06日
    浏览(73)
  • 分布式可视化 DAG 任务调度系统 Taier 的整体流程分析

    Taier 作为袋鼠云的开源项目之一,是一个分布式可视化的 DAG 任务调度系统。旨在降低 ETL 开发成本,提高大数据平台稳定性,让大数据开发人员可以在 Taier 直接进行业务逻辑的开发,而不用关心任务错综复杂的依赖关系与底层的大数据平台的架构实现,将工作的重心更多地

    2024年02月12日
    浏览(38)
  • 基于docker的分布式任务调度系统xxl-job搭建

    本文所使用的操作系统为: CentOS-7-x86_64-DVD-2009 xxl-job 依赖 mysql,所以必须要安装mysql才行! 访问以下链接:https://hub.docker.com/_/mysql/ 寻找自己需要的MySQL版本拉取即可 1.下载镜像 这里未指定版本号,默认拉取的是最新MySQL镜像 2.导入zip包 下载xxljob项目,查看releases版本 https:

    2024年02月20日
    浏览(58)
  • 【xxl-job】分布式任务调度系统xxl-job搭建

    XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展、开箱即用。 更多介绍,请访问官网:分布式任务调度平台XXL-JOB 前提条件:任务调度中心(xxl-job admin)依赖于 mysql,所以必须要安装mysql才行!安装mysql有2种方式:docker部署或

    2024年02月16日
    浏览(50)
  • 新起点!大数据分布式可视化的 DAG 任务调度系统 Taier 正式发布1.4版本

    我们很高兴向大家宣布,2023年4月14日,Taier 正式发布 1.4 版本。自2022年2月份 Taier 正式开源以来,收到了很多开发者和行业用户的积极评价,在诸多生产环境中已得到充分应用。Taier 1.4版本正是吸收了各类实践经验及大家的建议,进行了此次迭代优化。 本次更新不仅包含了性

    2023年04月20日
    浏览(54)
  • 分布式任务调度,定时任务的处理方案

    适用场景: Spring 定时任务是 Spring 框架提供的一种轻量级的任务调度方案,它的特点是简单易用、轻量级。Spring 定时任务的执行是在 单个节点 上进行的,如果需要分布式任务调度,需要自己实现相应的解决方案。 1.导入依赖版本自己控制 2.启动类加上@EnableScheduling 3.编写业

    2023年04月14日
    浏览(64)
  • 分布式之任务调度学习二

    Spring-quartz 工程 Spring 在 spring-context-support.jar 中直接提供了对 Quartz 的支持 可以在配置文件中把 JobDetail、Trigger、Scheduler 定义成 Bean。 4.1 定义 Job 4.2 定义 Trigger 4.3 定义 Scheduler 既然可以在配置文件配置,当然也可以用@Bean 注解配置。在配置类上加上@Configuration 让 Spring 读取到

    2024年02月03日
    浏览(69)
  • 分布式任务调度(00)--Quartz

    调度器 :工厂类创建Scheduler,根据触发器定义的时间规则调度任务 任务:Job表示被调度的任务 触发器:Trigger 定义调度时间的元素,按啥时间规则执行任务。一个Job可被多个Trigger关联,但是一个Trigger 只能关联一个Job 执行任务调度核心类QuartzSchedulerThread: 调度线程从JobSt

    2024年02月05日
    浏览(54)
  • 分布式定时任务调度框架Quartz

    Quartz是一个定时任务调度框架,比如你遇到这样的问题: 比如淘宝的待支付功能,后台会在你生成订单后24小时后,查看订单是否支付,未支付则取消订单 比如vip的每月自动续费功能 … 想定时在某个时间,去做某件事 Quartz是一套轻量级的任务调度框架,只需要定义了 Job(

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包