发布日期:2024-07-13 13:55 点击次数:193
Cron 剧本厚爱 Slack 的枢纽功能。它们确保领导依期实施、发送电子邮件见告和计帐数据库等。多年来,Cron 剧本的数目和这些剧本处理的数据量齐在加多。天然这些 Cron 剧本频频按预期实施,但跟着本事的推移,其实施的可靠性偶尔会着落,看重和推广其实施环境变得越来越重荷。这些问题促使咱们联想和构建一种更好的次序来大边界可靠地实施 Cron 剧本。
在 Slack 上运行 cron 剧本的风景可能与你预期的相同。有一个节点,里面有扫数要运行的剧本的副本,还有一个 crontab 文献,里面有扫数剧本的野心。该节点厚爱按照指定的野心在土产货实施剧本。跟着本事的推移,剧本的数目不停加多,每个剧本处理的数据量也不停加多。有一段本事,咱们不错不绝滚动到具有更多 CPU 和更多 RAM 的更大节点;这么不错让系统在大多数本事保捏运行。但设立仍然不太可靠——在一个盒子运行时,任何与建树、轮流或建树关连的问题齐会导致管事住手,从而影响一些枢纽的 Slack 功能。在不停向系统添加越来越多的补丁之后,咱们决定是时候构建一些新的东西了:一个可靠且可推广的 cron 实施管事。本文将详备先容这个新系统的一些枢纽组件和正式事项。
系统组件
在联想这项新的、更可靠的管事时,咱们决定诓骗许多现存管事来减少咱们必须构建的管事量,从而减少咱们今后必须看重的管事量。新管事由三个主要组件构成:
一项名为“Scheduled Job Conductor”的新 Golang 管事在Bedrock(Slack 对 Kubernetes 的包装器)上运行
Slack 的功课队伍,一个异步筹画平台,不错快速高效地实施无数责任
用于功课相通数据删除和监控的 Vitess 表,不错搜检功课的运行和失败情况
预定责任辅导
Golang 管事通过诓骗 Golang cron 库来师法 cron 功能。咱们聘任的库允许咱们保留在原始 cron 框上使用的疏导 cron 字符串时势,这使得搬动更玩忽且更荫庇易出错。咱们使用Bedrock(Slack 对 Kubernetes 的包装器)来莽撞推广多个 pod。咱们不会使用扫数 pod 来处理功课 - 违反,咱们使用 Kubernetes Leader Election 将一个 pod 指定给转化,并让其他 pod 处于待机模式,以便其中一个 pod 不错在需要时快速接纳。为了使 pod 之间的这种转化无缝邻接,咱们实施了逻辑以珍重节点在一分钟内停机,因为 - 议论到 cron 的性质 - 当时很可能需要安排剧本运行。乍一看,领有更多节点而不是唯唯一个节点来处理责任可能会更好地处罚咱们的问题,因为咱们不会有单点故障,也不会有一个 pod 实施内存和 CPU 密集型责任。关连词,咱们合计同步节点带来的吃力多于匡助。咱们之是以有这种嗅觉,有两个原因。最先,pod 不错十分快速地切换携带者,现实上不太可能出现停机。其次,咱们不错将现实运行剧本的实在扫数内存和 CPU 密集型责任卸载到 Slack 的功课队伍,而只将 pod 用于转化组件。因此,咱们有一个 pod 转化,还有几个其他 pod 在恭候转化。
功课队伍
这让咱们思到了Slack 的功课队伍。功课队伍是一个异步筹画平台,每天运行大致 90 亿个“功课”(或责任件)。它由一堆表面上的“队伍”构成,功课会流经这些队伍。玩忽来说,这些“队伍”现实上是一种逻辑风景,不错将功课从 Kafka(用于系统碰到故障或备份时的捏久存储)出动到 Redis(用于短期存储,允许将谁在实施功课的附加元数据与功课一谈存储)然后最终出动到“功课责任者”——一个准备实施代码的节点——它现实上运行功课。关连更多详备信息,请参阅本文。在咱们的例子中,一个功课是一个剧本。即使它是一个异步筹画平台,淌若将责任进攻在我方的“队伍”中,它也不错十分快速地实施责任,这便是咱们八成诓骗这个系统的风景。诓骗这个平台,咱们不错将筹画和内存问题滚动到一经不错处理负载(以及更多)的现存系统上。此外,由于该系合并经存在何况对 Slack 的责任至关迫切,咱们领先减少了构建本事,并减少了翌日的看重责任量,这是一个极大的顺利!
Vitess 数据库表
临了,为了完善咱们的管事,咱们使用了一个 Vitess 表来处理相通数据删除并向里面用户(其他 Slack 工程师)呈报功课追踪情况。咱们之前的 cron 系统使用flocks(一个 Linux 实用要津)来治理剧本中的锁定,以确保一次只运行一份剧本副本。大多数剧本频频齐能骄慢这个唯唯一个的条目。然而,有一些剧本消耗的本事比它们的相通本事要长,因此两个副本不错同期初始运行。在咱们的新系统中,咱们将每个功课实施记载为表中的新行,并在功课在系统中出动时更新其景况(入队、进行中、完成)。因此,当咱们思要启动新一轮功课时,咱们不错通过查询表中的举止功课来检验是否莫得正在运行的功课。咱们在剧真称呼上使用索引来加速此查询速率。
此外,由于咱们在表中记载了功课景况,因此该表还可用作包含 cron 剧本实施信息的玩忽网页的后台,以便用户不错莽撞搜检剧本运行的景况以及碰到的任何作假。此页面终点有效,因为某些剧本可能需要长达一小时智商运行,因此用户但愿八成考证剧本是否仍在运行,以及他们生机发生的责任是否莫得失败。
论断
总体而言,咱们实施 cron 剧本的新管事使经由愈加可靠、可推广且用户友好。天然在单个 cron 框上使用 crontab 一经让咱们获得了很猛施展,但它初始给咱们带来好多吃力,何况无法跟上 Slack 的边界。这个新系统将为 Slack 提供成长所需的空间,不管是当今如故翌日。
作家:Claire AdamsSenior Software Engineer
出处:https://slack.engineering/executing-cron-scripts-reliably-at-scale/