我正在尝试设计一个通用的作业调度程序,以扩展我的架构知识和在面试中思考系统设计问题的能力.到目前为止,我想出的是下面的内容.你能指出我应该在哪些方面努力做到全面解决这类问题吗?
我在线阅读了大量资源,但需要一些具体的指导才能继续前进.
为X公司设计通用的作业调度程序(这是当今的大型技术公司之一).
用例
创建/读取/更新/删除作业
调查过去运行的工作(工作类型,花费的时间,详细信息)
约束
每秒在系统上运行多少个作业?
=#jobs /小时由于用户+#jobs /小时由于机器
= 1m*0.5 /天/ 24/3600 + 1m/50*20/24/3600
〜= 12个工作/秒
系统需要存储多少数据?
推理:我只存储作业执行细节,在其他机器上完成实际工作(脚本执行),收集的一些数据是结束时间,成功/失败状态等.这些都可能只是文本,也可能是图形用于说明目的.我将通过作业调度程序(即过去10年)存储>>在系统中执行的所有作业的数据
=(设置作业详细信息的页面大小+收集的有关作业的数据大小)*作业数量*365>天*10年= 1 MB*900 000*365*10
〜= 3600 000 000 MB
= 3600 000 GB
= 3600 TB = 3.6 PB
抽象设计
根据上述信息,我们不需要太多的机器来保存数据.我会将设计分解为以下内容:
应用层:提供请求,显示UI详细信息.
数据存储层:类似于大型哈希表:存储键值的映射(键是由运行的dateTime组织的作业,而值将显示这些作业的详细信息).这样可以轻松搜索历史和/或预定作业.
瓶颈:
流量:12个工作/秒不是太具有挑战性.如果出现这种情况,我们可以使用负载均衡器将作业分发到不同的服务器以便执行.
数据:在3.6 TB时,我们需要一个可以轻松查询的哈希表,以便快速访问已在应用程序中执行的作业.
缩放抽象设计
这个作业调度程序的本质是它每个作业都拥有以下几个状态之一:Pending,Failed,Success,Terminated.没有业务逻辑返回很少的数据.
为了处理流量,我们可以拥有一个处理12个请求/秒的应用服务器和一个备份,以防这个失败.将来,我们可以使用负载均衡器来减少发送到每个服务器的请求数量(假设> 1台服务器正在生产中)这样做的好处是减少请求/服务器数量,增加可用性(如果一台服务器出现故障,以及处理spike-y交通井).
对于数据存储,要存储3.6 TB的数据,我们需要一些机器将其保存在数据库中.我们可以使用noSQL db或SQL db.鉴于后者有更广泛的使用和社区支持,这将有助于解决问题,目前被大公司使用,我会选择mySQL数据库.
随着数据的增长,我将采用以下策略来处理它:
1)在哈希上创建唯一索引
2)通过添加更多内存来垂直扩展mySQL数据库
3)通过分片对数据进行分区
4)使用具有主 - 主复制的主从复制策略来确保数据冗余
结论
因此,这将是我对作业调度程序组件的设计.
architecture n-tier-architecture job-scheduling system-design
我将字符串存储在变量名res下的列表中.接下来,我构建一个查询字符串列表的查询.然而,似乎没有读取变量.
这就是我的意思:
q) hdl: (to a port)
q) res: `string1`string2`string3
**q) ans: hdl"select count i by date,sym from trade where date=xxx, sym in `res"**
Run Code Online (Sandbox Code Playgroud)
当我执行命令时,我总是得到一个空的结果集.我知道结果集不能为空.那么如何修复我的查询(以粗体显示)以返回结果?
请注意我正在unix框中的aq会话中执行任务.
我正在检查函数中字符串的优先级.有没有办法改变我的代码以合并正则表达式 - 我对正则表达式很不熟悉,虽然我已经在线阅读了一些教程,但仍然没有得到'它'太好了.所以任何指导都会非常感激.
例如,在字符串XLYZ中,如果X之后的字符不是L或C,则会打印"违规"语句.这是下面的代码:
if (subtnString[cnt]=='X' && cnt+1<subtnString.length){
if(subtnString[cnt+1]!= 'L' || subtnString[cnt+1]!= 'C'){
System.out.println("Violation: X can be subtracted from L and C only");
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以使用正则表达式来替换这段代码?