Node 系统中定时任务的演化

发表于 2年以前  | 总阅读数:544 次

01 背景

北斗前端监控系统是 58 内部的一个线上质量监控排查解决方案,用于帮助用户大幅提升定位问题和优化项目的效率。系统共分为数据收集(SDK)、数据处理(Java)、数据存储(Druid、……)、数据分析(Node.js)、数据展示(React) 5 层模型。Node.js 作为系统中的数据分析层,提供各种数据分析和应用的方式。

在一期之后,系统的基础功能已经完备。平台可以收集 5 种类型、30 多种指标的数据,已经具备了很强的数据收集能力,数据应用的方式却很匮乏。

所以在二期开发时,我们计划在 Node 端加入多种数据应用的方式。实时告警,就是其中之一。

简单分析需求,服务端需要以一定的频次(例如每分钟)监测不同项目中用户配置关注的指标数值。当数值出现异常时,给用户发送邮件、短信等告警信息用于警示。

而其中的重点,就是如何在 Node.js 中设计并实现定时任务系统?

02 定时任务1.0-简单场景下的快速应用

定时任务 1.0 - 简单场景下的快速应用

初期的定时任务,是为告警而开发的,所以场景较为简单。

  • 生产者:定时生成多种告警指标、几百个项目下的定时任务。
  • 消费者:执行定时任务,进行阈值计算并告警。

由于指标已经固定,且当时没有告警外的其他应用场景,所以可扩展性不是影响系统的重要因素。而集团内部平台用户量级较小,安全、成本等其他因素也不会成为瓶颈。系统的复杂度主要来自于对可用性的支持。

作为一个稳定的系统是必须在集群内多个机器中运行的。分布式必然会带来额外的系统复杂度。

2.1 分布式

当集群内有多台服务器,我们如何保证定时任务可以由不同的机器不重复的执行呢?

大家可以很容易的想到 MQ(消息队列)和分布式锁。两者也都有相关的 Node.js 库,基于 MQ 的 node-kafaka 以及基于锁的 Redlock

在当时的场景下,我们需要低成本快速的上线告警系统。MQ 虽然功能完备,支持更为复杂的功能,但是相对于抢锁机制复杂度太高,在简单的场景下优势又不是很明显。所以最终选择基于 Redlock 的抢锁机制实现分布式定时任务。

  • 当集群内的机器使用 node-schedule 判断到达定时任务的执行时间时(例如每分钟执行),会同时使用 Redlock 进行抢锁操作。
  • 多个定时任务,配置不同的 key。同一时间内,如果锁没有被释放它只会被一台机器获取。这样我们就保证了定时任务只被一台机器执行。
  • 抢锁成功的机器会执行定时任务,计算数据是否异常并告警。
  • 在适当时时机将锁释放即可,只要保证抢锁的时间段内锁存活即可。

这样我们就保证了分布式系统内定时任务只执行一次。

可以看到 1.0 版本的定时任务是单独为告警而开发的,此时的告警模块流程简单,且指标数量较少。系统内的生产者和消费者也没有进行解耦,整体流程是线性的。在当时的场景下,这种基于 Redlock 的定时任务方案完全可以支撑业务稳定运行。

03 定时任务2.0-复杂场景下的架构升级

随着平台的扩展,告警增加了自定义告警功能。定时任务也增加了采样分析、定时数据缓存、定时周报等大量定时任务的执行。此时,1.0 版本的定时任务系统开始涌现出各种问题。

  • 任务分配不均匀。当定时任务数量增大后,出现了任务分配不平衡的问题,集群内某些机器抢到了更多的任务,某些机器抢到任务较少,资源利用不平衡。
  • 随着数据量级增大,生成任务和执行任务时间复杂度相差较大,当定时任务过多时会对系统性能造成负担。
  • 任务执行顺序无法保证,当遇到需要按序下发的定时任务时无法保证。
  • 定时任务可靠性较低,没有持久化存储任务列表,执行异常的任务没有重试机制。
  • ……

随着系统的扩展,单独为告警而开发的定时任务运行着很多额外的模块。虽然整体流程还没有被阻塞,但是随着后续系统的扩展,必然会导致系统越来越不稳定。于是我们计划重构定时任务,使其能够作为一个通用的子模块,承载多样的定时任务。

1.0 时没有引入消息队列或任务队列来处理定时任务,是因为当时的场景下对保序、异常任务重试等特性没有强需求,接入任务队列后系统复杂度却会高很多。而 2.0 时作为通用模块,则需要一定的机制来保证这些特性,于是我们决定引入任务队列的概念来进行系统重构。

此时的系统结构如下:

生产者生产任务,会将任务推送到任务队列中,通过任务队列可以保证任务的有序性。

消费者异步按需的获取对应的 Job,也可以选择在空闲时再继续获取执行新的任务,而不是所有的定时任务堆积到系统中一起执行。解决了任务均匀下发,按需执行的问题。

通过任务队列,可以维护任务的执行状态。这样持久化存储或失败重试的功能也可以开发相应的功能去做扩展。

3.1 业内实现

在业内 Node 端的任务队列也有很多完整的实现方案,且都经过了大量的场景校验,不需要我们去重复的造轮子。引用 bull 官方的一张对比表,我们整理部分对比如下。

Agenda 是基于 mongo 的任务队列解决方案,更偏向于定时任务。

Bee 是一个简单、快速的 Node.js 作业/任务队列,更专注于小粒度任务的处理,并极大的优化此场景下的性能,由 Redis 提供支持。

Bull 提供完整的任务队列解决方案,有较活跃的受众及系统更新频率。

对比其功能及差异,bull 是目前功能最完善的框架,社区也非常活跃,其丰富的事件回调也能支持我们对流程进行细粒度的把控。

最终在做了技术调研之后,新系统的重构方案就选择使用 bull 来作为基础框架,特定的功能场景下单独进行开发支持。

那么在 bull 中,任务是如何进行流转的呢?

bull 中分为生产者和消费者两种角色,使用 LPUSH/BRPOPLPUSH 命令来维护任务主队列,同时还加入了多种辅助数据结构,为系统丰富的功能做支持。

当生产者生成一个 Job 后,会尝试推送到 Redis 对应的任务队列中(List)。bull 会通过 JobId 区分是否重复推送了一个 Job,以此来实现任务去重功能。

消费者使用 BRPOPLPUSH 命令阻塞式读取任务列表,而不需要轮询的读取。当 List 中有新的 Job 后会将任务分配给消费者。通过配置并发数,也可以控制同一个消费者并发执行任务的数量。

当 Job 执行完成后,消费者给出反馈。此时 bull 更新任务队列中 Job 的状态,并触发对应的事件。

依靠其细粒度的状态存储记录,bull 也支持可靠的任务重试机制,当服务重启或任务执行失败时,bull 可以通过 Job 执行记录来重新执行未完成的任务,极大的提高了系统的可靠性。

可以看到,bull 与 2.0 的系统结构非常契合,我们只需要在此基础上进行二次开发就可以完成 2.0 定时任务系统的重构。

最终定时任务系统架构的设计如下:

生产者

  • 通过 node-schedule 触发定时任务。虽然 bull 也支持定时任务,但是其定时任务对 Redis 依赖过高。当 Redis 中数据结构改变时会影响到系统中定时任务的执行,其可用性较低。所以使用 cron 相关的库手动触发定时任务,来保证系统的稳定性。
  • 当定时任务触发后,集群内的多个机器会构建 JobId,然后使用 bull.add 将任务推送到任务队列。此处我们使用一定的 JobId 生成算法来保证同一时间段内,JobId 的一致性。当任务队列检测到相同的 JobId 时,只会添加一个。
  • Redis 使用 List 及其他的数据结构来维护任务队列的执行及对其持久化存储。

消费者

  • 消费者会使用 BRPOPLPUSH 命令阻塞式读取任务队列中的任务,当队列中有任务添加时将其弹出并执行。这里可以通过并发配置同时执行的任务数量。
  • 系统检测 process 函数是否有对应 name 或 * 的 handler,如果有执行对应的回调函数。
  • 在不同的事件流节点中,会触发对应的事件回调函数。
  • 当任务执行完成时,必定会指向 completed(成功)、failed(失败)的状态。在其回调函数中判断是否为同一批任务的最后一个任务,如果是最后一个任务则本批次的定时任务全部执行完成,触发 finished 事件。此处注意读取状态及状态写入 Redis 需要使用事务保证原子性。

到此,2.0 版本的定时任务系统就已经设计完成了。

纵观北斗监控系统中定时任务的发展。

初期由于功能简单,且需要快速上线。所以使用 Redlock 开发了基于抢锁机制的定时任务。

后续由于系统功能的扩展,需要支撑更多的定时任务。原系统中的弊端逐渐显露并对系统开发维护带来了困难,此时引入了消息队列的概念优化系统模型。

在持续的迭代中,系统功能也趋于稳定和完善。在目前的北斗监控系统中,定时任务系统支撑着实时告警、采样分析、定时数据缓存、定时周报等大量任务的稳定运行。

但这不是终点,后续一定会遇到更多的挑战,系统的架构也可能进一步升级。而我们需要做的就是拥抱变化,适配我们当下的业务场景去做合适的选择。

参考链接

redlock:https://redis.com/redis-best-practices/communication-patterns/redlock/

bull:https://github.com/OptimalBits/bull

Redis 核心技术与实战:https://time.geekbang.org/column/article/284291

agenda:https://github.com/agenda/agenda

bee-queue:https://github.com/bee-queue/bee-queue

- END -

本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/LAXFhgVssZkP4cUnuoZnug

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237239次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8075次阅读
 目录