Architecture 设计一个通用的作业调度器

Architecture 设计一个通用的作业调度器,architecture,job-scheduling,n-tier-architecture,system-design,Architecture,Job Scheduling,N Tier Architecture,System Design,我正试图设计一个通用的作业调度程序,以扩展我的体系结构知识和在面试中思考系统设计问题的能力。到目前为止,我得出的结论如下。你能指出我在处理这类问题时应该在哪些方面进行全面的工作吗 我在网上读了很多资料,但在前进中需要一些具体的指导 为X公司设计一个通用的作业调度程序(这是最大的 今天的技术公司) 用例 创建/读取/更新/删除作业 调查已在中运行的作业 过去(工作类型、花费的时间、详细信息) 约束 每秒将在系统上运行多少个作业 =#用户作业/小时数+#机器作业/小时数 =1m*0.5/天/24/3

我正试图设计一个通用的作业调度程序,以扩展我的体系结构知识和在面试中思考系统设计问题的能力。到目前为止,我得出的结论如下。你能指出我在处理这类问题时应该在哪些方面进行全面的工作吗

我在网上读了很多资料,但在前进中需要一些具体的指导

为X公司设计一个通用的作业调度程序(这是最大的 今天的技术公司)

用例

创建/读取/更新/删除作业

调查已在中运行的作业 过去(工作类型、花费的时间、详细信息)

约束

每秒将在系统上运行多少个作业

=#用户作业/小时数+#机器作业/小时数

=1m*0.5/天/24/3600+1m/50*20/24/3600

~=12个作业/秒

系统需要存储多少数据

推理:我只存储作业执行细节,实际 工作(脚本执行)在其他机器和一些 收集的数据包括结束时间、成功/失败状态等。这些都是> 所有可能只是文字,可能带有插图。我 将通过存储>>在系统中执行的所有作业的数据 作业调度程序(即过去10年)

=(设置作业详细信息的页面大小+收集的作业数据大小)*#作业数*365>天*10年 =1MB*900000*365*10

~=36000000MB

=3600 000 GB

=3600 TB =3.6 PB

抽象设计

基于以上信息,我们不需要太多 用来保存数据的机器。我会把设计分解成几个部分 以下:

应用层:为请求提供服务,显示UI详细信息

数据存储层:就像一个大哈希表:存储 键值(键值是按作业运行的日期时间组织的作业, 而这些值将显示这些作业的详细信息)。这是为了使 轻松搜索历史和/或计划作业

瓶颈:

流量:12个工作/秒并不太具有挑战性。如果这个尖峰,我们可以 使用负载平衡器将作业分发到不同的服务器,以便 执行

数据:在3.6TB的容量下,我们需要一个可以轻松访问的哈希表 查询以快速访问已在中执行的作业 应用程序

缩放抽象设计

此作业调度器的本质是,它每个作业都拥有一个 少数状态:挂起、失败、成功、终止。没有业务逻辑 返回的数据很少

为了处理流量,我们可以有一个应用服务器 每秒处理12个请求,并在该请求失败时进行备份。在里面 将来,我们可以使用负载平衡器来减少请求的数量 转到每台服务器(假设生产中有>1台服务器)的优势 其中之一是减少请求/服务器的数量,增加 可用性(如果一台服务器出现故障,并处理spike-y流量 嗯)

对于数据存储,要存储3.6 TB的数据,我们需要几台机器 将其保存在数据库中。我们可以使用noSQL数据库或SQL数据库。鉴于 后者有更广泛的普及和社区支持,这将有所帮助 在解决问题方面,目前大公司正在使用 我会选择mySQL数据库

随着数据的增长,我将采用以下策略来处理 它:

1) 在散列上创建唯一索引

2) 通过添加更多内存垂直扩展mySQL数据库

3) 通过分片对数据进行分区

4) 使用主从复制策略与主从复制策略 复制以确保数据冗余

结论

因此,这将是我对作业调度器组件的设计


我建议你为这项工作寻找一条信息总线。或者,如果您希望了解这种总线所允许的体系结构,请查看NServiceBus

如果你使用的是公交车,你可以很容易地限制你的排队。这可能会减慢处理速度,这意味着您需要研究并发性

通常认为编写这样的服务很容易。事实并非如此

还有一些事情需要考虑

消息失败时发生的情况。它迷路了吗?你会后退吗?
如何扩展您的体系结构。您能否轻松添加新的客户机/消费者?

您描述的许多内容都是通过不同的框架实现的,用于调度作业和执行作业。一个我知道的-。虽然我会在Quartz中实现一些不同的东西,但它有很好的文档记录,可以让您了解工作以及他们通常面临的障碍

您描述的方法很好,但我将从中消除特定于领域的关注点(如并行处理、切分、缩放)。如果作业要在不同的机器上运行,那是因为具体的情况(例如,为金融银行运行的作业)不能放在一台机器上。作为工作引擎的开发者,我认为你不应该对此感到担忧。原因是您正在开发一个框架,而不是一个产品化的应用程序

如果您打算为作业引擎本身引入切分,我认为您高估了作业引擎本身的复杂性。作业执行(框架)部分本身不会有太大的意外情况。然而,具体的实现,例如银行软件作业,可能需要处理相同的数据,但不同的数据集,然后就有了切分。因此,简而言之,引入缩放机制超出了您的能力范围

还有一点,我看不出作业执行和messagin之间有什么相似之处