iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >Node中怎么实现一个定时脚本
  • 460
分享到

Node中怎么实现一个定时脚本

2024-04-02 19:04:59 460人浏览 安东尼
摘要

node中怎么实现一个定时脚本,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。初步方案经过方案设计之后形成了上述的方案:在服务器部署初始化时(i

node中怎么实现一个定时脚本,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

初步方案

Node中怎么实现一个定时脚本

经过方案设计之后形成了上述的方案:

  1. 服务器部署初始化时(init.ts初始启动文件中)启动node-schedule的定时任务,读取数据库中的企业微信的企业配置,然后并行启动若干企业的组织架构更新进程。

  2. 企业微信提供了获取部门成员的详情,因此只需并行更新每个部门的信息,并且写入Mysql数据库中。

    Node中怎么实现一个定时脚本

  3. 当查询接口到达服务器后,首先从数据库中查询该手机号对应的成员,若不存在则从企业微信侧调用手机号获取userid api,然后通过获取用户信息API获取最新的用户信息,避免定时更新带来的更新时间gap;若存在则直接返回数据库中的信息。

    Node中怎么实现一个定时脚本

开发过程中的踩雷

整体业务逻辑并不复杂,调试和部署的过程中遇到许多问题,这里给大家一一列举下:

1. 访问频率受限

企业微信官方规定同一时间对同一份资源的请求数不可超过一定数值(60),由于部门详情的请求接口采用的并行模式,因此超过了阈值,测试过程中被官方封禁了IP。

2. 过多进程导致SQL慢查询

没有考虑多地部署(3地 * 5服务器 * 8 worker)导致同时存在了120个更新进程,进而导致数据库mysql的读写混乱,也消耗了大量性能,导致数据库读写压力比较大时,出现了部分慢查询的情况

3. 无效手机号不可调用企业微信api

企业微信对手机号获取userid的接口,具有以下限制:当查询中出现一定数量的无效手机号时,会触发企业微信官方IP封禁。但是业务系统中存在大量离职后的无效手机号,因此当检查到数据库中不存在时,频繁调用上述接口则会触发封禁。

4. 数据库读写冲突

由于存在多台服务器同时读写数据库,导致数据库出现了部分重复、缺少的情况。

5. 网络环境导致读写锁的平衡性失效,产生衍生问题

为了优化上述部分,引入的任务读写,保证单一进程更新。但是未考虑各地服务网络情况,导致内网服务器一直持有读写锁,失去了均衡负载的设计有效性。也导致在配置预上线环境时,预上线环境由于网络环境良好一直持有读写锁,进而影响线上的实时数据。

未考虑失败情况进行报警和恢复

深度优化设计

下面介绍下如何解决这些问题和思路和方案。

1、访问频率受限

这里针对“部门成员信息API“的并行请求,改造成基于有效频率值的串行发送机制,设计成10个/每秒的调用速度。

2、过多进程导致SQL慢查询

这个解决方案比较明确,就是减少启动定时任务的进程数。

Node中怎么实现一个定时脚本

由于后端服务一般分为测试环境、预上线环境、正式环境,不同的环境中是否需要启动各个定时器脚本可以通过部署时(以SKTE为例),设置环境变量 “SCHEDULE_ENV” 来管理。

Node中怎么实现一个定时脚本

每台服务器会启动8个worker进程,每个worker使用 “ process.env.IMSERVER_WORKER_ID ” 变量进行标识,因此可以设计只有“worker1”进程来进行定时任务的启动;

3、无效手机号不可调用企业微信api

这个是在技术调研中没能发现的情况,发现前期技术调研的工作疏忽。

首先是业务调用方是无法得知手机号是否有效,且也不应该去关心这个限制,因此原先为了解决部分新 纪录更新不及时的问题,而引入的实时查询机制是不合理的。

实时查询机制:“对于数据库中不存在的手机号,通过企业微信官方api进行实时查询来返回结果”

因此移除了这个机制,并且提供了一个基于企业微信官方API的实时查询接口,每次业务方调用时,也将结果同步更新到组织架构中。

4、数据库读写冲突

引入Redis任务锁机制,保证同一时间内只有一个进程能够进行数据库更新操作。

Node中怎么实现一个定时脚本

其次是企业之间的更新采用并行机制,由于相互之间是互不冲突的,因此不会引起同一条记录的读写冲突,也可以提升其更新速度。

5、网络环境导致读写锁的平衡性失效,产生衍生问题

在最初的设计中,我希望服务器之间能够根据自身的负载情况来进行公平竞争任务锁,但是实际情况是由于多地部署,其中稳定的内网环境可以一直优先获取到任务锁,就是没有所谓的公平性了。

特别是当压测需要部署预上线环境时,如果没有设置只读db账号并且没有设置启动定时任务环境变量,这两个失误会导致某一次的组织架构更新逻辑调整的代码更新到线上时,线上一直是旧的逻辑在执行,经过一系列排查我们发现预上线环境一直获取了读写锁,使用旧的逻辑更新数据库。

因此增加环境变量来控制定时任务启动、对于压测的环境的中的数据库权限进行了区分,增加了只读模式。

6、报警和错误恢复

这里有一点前端思维定势的影响了,这一部分是同样重要的。

报警方面

则是接入IMLog的Node SDK,通过 Kibana 和 Grafana 的系统配置,可以有效监控组织架构的更新情况。

Node中怎么实现一个定时脚本

错误恢复方面

这里的错误主要是发生在企业微信API的access_token过期的情况,常发生于以下两种情况:

  1. 企业微信官方主动使access_token过期

  2. 在组织架构更新过程中,access_token刚好失效情况,也就是Http传输到企业微信刚好失效的情况

以上的情况是无法避免的。这里使用中间件对node.fetch进行封装,增加对response的返回值的校验,如果企业微信api的返回值是  “ WX_CODE.INVALIDE_TOKEN ”  则进行预警和重置accessToken。

export default (app) => {   const { utils: { imlogHelper } } = app;   const wrapperLogFetch = (originFetch, {     traceId,     header,     client_ip,   }) => async (...args) => {     const res = await originFetch(...args);     if (res.errcode === WX_CODE.INVALIDE_TOKEN) {       // 进行更新逻辑       wxService.clearAllRedisKey();       imlogHelper({         cmd: url,         message: 'accessToken_update_warning',         body: JSON.stringify(res),         trace_id: traceId,         retcode,         headers: header,       });     }     return res;   };     // 覆盖context.fetch方法   return async (ctx, next) => {     if (!ctx.logFetch) {       const originFetch = ctx.fetch;       const { traceId, ip: client_ip } = ctx.request;       const header = jsON.stringify(ctx.request.header);       const logFetch = wrapperLogFetch(originFetch, {         traceId,         header,         client_ip,       });       ctx.logFetch = logFetch;     }     if (ctx.fetch !== ctx.logFetch) {       ctx.fetch = ctx.logFetch;     }     await next();   }; }

总结

Node中怎么实现一个定时脚本

经过重新设计和验证后形成以上的设计方案,具有以下优化点:

  1. 首先通过基于redis setnx实现的任务锁,来实现同一时间单进程更新数据库;

  2. 通过部署时设置定时任务启动环境变量和数据库读写账号设置,来保证不同环境的分离;

  3. 通过企业并行,部门数据拉取接口串行的模式,最大化性能和避免API调用封禁;

  4. 完善错误恢复机制和报警,实时查看运行状况。

看完上述内容,你们掌握Node中怎么实现一个定时脚本的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网html频道,感谢各位的阅读!

--结束END--

本文标题: Node中怎么实现一个定时脚本

本文链接: https://www.lsjlt.com/news/74234.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node中怎么实现一个定时脚本
    Node中怎么实现一个定时脚本,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。初步方案经过方案设计之后形成了上述的方案:在服务器部署初始化时(i...
    99+
    2024-04-02
  • node怎么实现定时任务
    本教程操作环境:linux7.3系统、node18.4.0版、Dell G3电脑。node怎么实现定时任务node定时任务(node-schedule模块)实现一个每天凌晨十二点更新服务器上的git代码的功能koa2框架下的app.js文件...
    99+
    2022-11-22
    定时任务 node
  • 羊了个羊通关脚本Vue node实现版本
    目录vue-sheep特性使用预览截图vue-sheep 本项目使用 vue2 + nodejs实现羊了个羊快速通关,仅为学习使用,请勿使用本程序恶意对游戏服务器持续造成压力,一切后...
    99+
    2024-04-02
  • 怎么在Shell脚本中实现一个ftok函数
    怎么在Shell脚本中实现一个ftok函数?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。#!/bin/shlet key=0function ftok(...
    99+
    2023-06-09
  • Java 中怎么实现一个定时任务
    Java 中怎么实现一个定时任务,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。实现逻辑:新开一个线程,添加一个 for/ while 死循环,然后在死循环里面添加一个 sl...
    99+
    2023-06-15
  • php如何实现一个条件成立时执行脚本外的另一个php脚本
    在php开发中,我们经常需要在满足一定条件时执行某个脚本,这时候我们可以使用php的条件语句和系统命令,实现一个条件成立时执行脚本外的另一个php脚本。一、条件语句php中经常用到的条件语句有if、else语句和switch语句。根据不同的...
    99+
    2023-05-24
  • 如何使用vbs实现一个定时关机或重启的脚本
    这篇文章主要介绍了如何使用vbs实现一个定时关机或重启的脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。dim ActionID ActionID =&...
    99+
    2023-06-08
  • Python如何实现一个春节倒计时脚本
    这篇文章给大家分享的是有关Python如何实现一个春节倒计时脚本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。环境安装Python3、 Pycharm (如需安装包、激活码等直接私信我即可安装问题解答都可以的哈~...
    99+
    2023-06-28
  • node中怎么实现一个跨域请求
    这期内容当中小编将会给大家带来有关node中怎么实现一个跨域请求,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。第一种:jsonp参看用nodejs实现json和jsonp...
    99+
    2024-04-02
  • 基于Python实现一个春节倒计时脚本
    目录前言​环境安装效果展示代码展示补充前言​ 春节对于中国人民群众来说,是一个意义非凡的节日,它意味着一年的结束和新年的开始,很多人为了表达自己的期盼,都会进行倒计时。 &ldquo...
    99+
    2024-04-02
  • 怎么在Shell脚本中调用另一个脚本
    这期内容当中小编将会给大家带来有关怎么在Shell脚本中调用另一个脚本,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。forkfork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调...
    99+
    2023-06-09
  • node中怎么实现一个http小爬虫
    这篇文章给大家介绍node中怎么实现一个http小爬虫,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。爬取Node.js 教程首页的所有数据建立node-http.js,其中代码如下,代...
    99+
    2024-04-02
  • 怎么在Shell中实现一个crontab定时任务
    怎么在Shell中实现一个crontab定时任务 ?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。crondtab定时任务crondtab是linux下用来周期性的执行某种任...
    99+
    2023-06-09
  • 怎么在shell实现定时周期性执行脚本
    这期内容当中小编将会给大家带来有关怎么在shell实现定时周期性执行脚本,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。示例编写测试脚本脚本 time .sh$ cat time.sh&...
    99+
    2023-06-09
  • Oracle数据库中怎么实现一个自动备份脚本
    这篇文章给大家介绍Oracle数据库中怎么实现一个自动备份脚本,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、备份脚本1、初始化变量,记录开始日志#变量  sysname=...
    99+
    2024-04-02
  • 使用python怎么实现一个定时器
    这期内容当中小编将会给大家带来有关使用python怎么实现一个定时器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚...
    99+
    2023-06-14
  • Apache DophinScheduler定时调度Python脚本的实现
    目录前言1.创建租户2.指定用户的租户3.创建Python环境4.创建项目5.创建工作流6.上线项目7.设置调度时间8.上线定时管理9.查看日志前言 本文通过定时调度Python的例...
    99+
    2023-03-23
    定时调度Python脚本 Apache DophinScheduler定时调度
  • Python实现多脚本处理定时运行
    目录前言:一、创建时间二、设定时间前言: 管理多脚本,要实现大量统计计算以及大量脚本进行统计,定时运行并反馈结果是很多大数据项目场景中十分常见的,就该问题本篇文章提供思路方法以及部分...
    99+
    2024-04-02
  • mysql如何实现定时备份shell脚本
    这篇文章给大家分享的是有关mysql如何实现定时备份shell脚本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 #!/bin/bashecho &q...
    99+
    2024-04-02
  • 使用APScheduler怎么实现一个定时任务
    使用APScheduler怎么实现一个定时任务?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、安装apschedulerpip install apschedulerpi...
    99+
    2023-06-14
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作