自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 基于Redis 的任务队列Bull -- (十九)sandbox/child-pool

bull在设置处理器时,如果处理器是字符串类型则认为它是js脚本路径这种情况下会在单独的 node 进程中运行进程函数。这类进程称为沙盒进程如果沙盒崩溃,不会影响任何其他进程,并且会自动生成一个新进程来取代它。setHandler 方法中,会使用沙盒包装指定的处理器脚本,然后用进程池来运行它。

2024-03-04 16:28:14 30

原创 基于Redis 的任务队列Bull -- (十八)timeout/cancel

bull 的 job timeout 属性是通过将 job 的 handler 转换成 cancelablePromise 实现的。然后看第二个问题,我们给 job 加上超时 timeout,注意要把 attempts 设为 0,这样就不会重试。而 es6 原生的 Promise 是不可从外部取消的,所以这里的 promise.cancel 只有象征意义。具体的说,用一个 Promise 包装 handler,然后设置一个 timeout 定时器。job 的超时设置是如何工作的。这个可以通过源码来解释。

2024-03-03 21:52:27 34

原创 基于Redis 的任务队列Bull -- (十七)priority / lifo

然后是同时使用 priority 和 lifo 的情况,从1到10,每到5添加一个 lifo 为 true 的 job。当优先级为0时,lifo 为 false 意味着使用 LPUSH,lifo 为 true 意味着使用 RPUSH。这存在一个显而易见的问题,就是 lifo 为 true 的 job 不会放在 priority zset 里。输出如下,可以看到 lifo 为 true 的不是最优先执行的,而且优先级顺序也被打乱。所以 lifo 为 true 的 job 会打乱优先级的排序。

2024-03-03 21:29:09 30

原创 基于Redis 的任务队列Bull -- (十六)backoff

bull 在add job 时,有一个 backoff 选项,用于指定当 job 失败时的退避策略。注意,内建策略函数是高级函数,根据 backoff.delay 返回一个闭包函数。计算退避delay值时,首先要查找退避策略函数,然后调用函数返回 delay。具体的说,当 job 失败时会根据策略函数,得到一个 delay 值。它是一个对象,key 代表自定义策略类型,value 代表策略函数。查找策略函数,首先从自定义策略中查找,然后从内建策略中查找。fixed 代表固定延迟退避,每次的延迟值都一样。

2024-03-03 19:45:09 24

原创 基于Redis 的任务队列Bull -- (十五)failed

然后它会检测 this.attemptsMade 和 this.opts.attempts 的大小,如果尝试次数超出,则 moveToFailed。bull 中 job 的 moveToFailed 和 moveToCompleted 虽然非常像,都调用了 moveToFinished 方法。如果 moveToFailed 为 true,则调用 moveToFailed 脚本。如果没有达到尝试次数,则计算它的退避策略,得到一个退避的 delay。delay 为 -1 代表应该 moveToFailed。

2024-03-03 19:16:58 18

原创 基于Redis 的任务队列Bull -- (十四)completed

当 maxAge 有效时,根据 score 从 zset 中取出大于 maxAge 的 job id,删除 job 数据,然后从 zset 中移除。当 count 有效时,取出 zset 中 score 较低且数量超出的 job id,删除 job 数据,然后从 zset 中移除。如果 N > 1代表大于1分钟,则对 list LPUSH 一个delta,N-1个0,否则 LPUSH 一个 delta。如果 N 大于 0,代表到了计数周期,如果 N 小于 0 就什么也不做,因为计数粒度以分钟计。

2024-03-03 18:50:38 15

原创 基于Redis 的任务队列Bull -- (十三)repeat job

当 add repeat job 时,会调用一次 nextRepeatableJob ,它会创建当前这次要运行的 Job。当 repeat job 结束时,会再次调用 nextRepeatableJob ,它会创建下次要运行的 Job。总的来说,bull repeat job 的执行是链式的,下一次job开始于上一次job的结束。bull在add job时可以设置任务的repeat选项,用于定时重复执行 job。从这里算起,repeat job 和普通的 job 就完全一样了,会执行相同的流程。

2024-03-02 23:12:58 35

原创 基于Redis 的任务队列Bull -- (十二)pause/resume

对于 global 的pause,则在执行操作时会检测 meta-paused key,以决定 target 队列是 wait 还是 paused。如果是local的pause,只是设置一个 this.paused 的 Promise,然后调用 resumeLocal 恢复。这样的操作在很多脚本中都出现,global pause 只是将 wait 队列变成了 paused 队列,恢复时改回来。pause 和 resume 的操作应该是一一对应的,local 对 local,global 对 global。

2024-03-02 22:02:49 21

原创 基于Redis 的任务队列Bull -- (十一)rate limit

如果 job 没有被速率限制且 limited set 中 job 数量不为0,则根据 limited count 计算一个延迟时间戳。添加 job 时,如果 limiter.groupKey 存在,会生成一个包含指定值的 job id。bull在add job时,有一个 rate limit 选项,设置了队列处理job的速率限制。如果 job 已经被速率限制,则意味着它应该被再次处理,即再次执行 maxJobs 判断、如果上面两步计算后得到的 delay 大于0,代表 job 应该被速率限制。

2024-03-02 17:16:05 30

原创 基于Redis 的任务队列Bull -- (十)lock机制

bull使用一个格式为[keyPrefix]:[queueName]:[id]:lock的key来锁定 job 的运行时状态。加锁的位置是job进入运行状态时的 moveToActive 脚本,锁的value是queue的唯一token。对于 queue 的 stalled check 任务,只有lock丢失的运行时任务会被认为是停滞的。extendLock script的内容很简单,就是重新设置锁的 key 以及过期时间。释放锁的位置是 job 完成退出运行时状态的 moveToFinished 脚本。

2024-03-02 11:37:32 34

原创 基于Redis 的任务队列Bull -- (九)delayed job

当 add job时,如果delayedTimestamp 不为 0,则将 job id 加入 delayed zset。它将时间戳数字二进制左移十二位,然后低十二位填充job id的值,最后得到一个不会重复的 timestamp。delayed zset 的成员是 job id,score 是一个计算后得到的 timestamp。然后和 add job 一样,根据 job 的优先级将 job 放入合适的队列与位置。注意,updateDelaySet参数是当前时间戳,即执行当前到期的所有延迟队列。

2024-03-01 23:18:59 14

原创 基于Redis 的任务队列Bull -- (八)stalled job

所以 stalled 队列中的 job id 只能说是可能 stalled ,而不是说在 stalled 队列里就代表它实际上已经停滞。bull会在每次执行 stalled check 结束时,将 active 队列中的job id分批全量刷入 stalled 队列。moveUnlockedJobsToWait会执行lua脚本,获取失败的job和停滞的job,然后发出对应的 event。bull将丢失锁的 job 称为停滞 job,认为这些 job 因为某些原因导致执行不成功,且还在active状态。

2024-03-01 21:24:11 46

原创 基于Redis 的任务队列Bull -- (七)process job

bull 通过 process 方法定义 job 的处理器,并且开始执行 jobname / concurrency 是可选参数,handler 是必选参数默认的 name 是 Job.DEFAULT_JOB_NAME,concurrency 是 1虽然 process 方法返回 Promise,但是一般不会等待它。

2024-02-29 17:40:03 16

原创 基于Redis 的任务队列Bull -- (六)add job

但是它的优先级是最高的,此时 len - (count-1) 这个计算方式应该是不准确的,它没有考虑到 RPUSH 的 job。job id key的格式是 [keyPrefix]:[queueName]:[id],用于存储job数据的hash。然后计算 priority zset 中 0-当前job优先级的 job 数量,即优先级大于等于当前的 job 数量。优先级不为0时,要根据当前job优先级排名,将job插入目标队列(wait 或 paused)的指定位置。

2024-02-28 17:04:05 21

原创 基于Redis 的任务队列Bull -- (五)lua脚本的使用

bull 使用 lua 脚本执行各种任务,ioredis的defineCommand方法将lua脚本定义成redis client的方法Redis 保证脚本的原子执行。执行脚本时,所有服务器活动在其整个运行期间都会被阻止。这些语义意味着脚本的所有效果要么尚未发生,要么已经发生。可以直接通过 client 来调用脚本。

2024-02-28 10:37:23 21

原创 基于Redis 的任务队列Bull -- (四)global/local事件机制

bull通过eclient订阅队列的channel事件消息,然后在当前队列上发出本地或者全局的对应事件local事件格式为 completed / failed ,代表事件所属job属于本地的queueglobal事件格式为 global:completed / global:failed , 代表全局事件,无论 job 是否在本地queue运行。

2024-02-27 17:18:48 19

原创 基于Redis 的任务队列Bull -- (三)多个客户端

bull在创建队列时会创建三个redis客户端,分别用于不同的任务。

2024-02-26 22:01:48 30 1

原创 基于Redis 的任务队列Bull -- (二)redis里的数据存储

bull将所有运行时数据存储到redis的数据解构中,使用redis事务和脚本来操作数据,保证操作的原子性。

2024-02-26 20:36:12 37 1

原创 基于Redis 的任务队列Bull -- (一)简介

bull自称是最快、最可靠、基于 Redis 的 Node.js 队列。为了坚如磐石的稳定性和原子性而精心编写。所以我们来看一看怎么搞的。

2024-02-26 15:46:05 98

原创 mxnet1.9.1+cuda11.8+rtx4090+vs2022+win11源码编译安装

最近在学习 mxnet,虽然它过气了,但是还是一个很好的学习平台,毕竟教程搞得好,大家都来搞。既然搞了深度学习那必须用gpu啦,但是mxnet的预编译包最多只支持 cuda11.7,而且好像还不支持windows平台看这张图片,前面说了支持 Linux 和 Windows 平台,后面又说 Windows 是其他平台,需要从源码构建还可以查找下这个链接:https://dist.mxnet.io/python,反正我是没找到1.9.1且适配cuda117的windows的.whl文件。

2023-07-06 22:24:40 633 2

原创 nodejs源码解析之一 (windows 编译脚本 vcbuild.bat)

repo:vcbuild.bat 是一个 Windows 平台下的批处理脚本,用于构建 Node.js 源代码。它使用 Visual Studio 的命令行工具 msbuild 来编译和链接 Node.js 的 C++ 模块,生成可执行文件和库文件等。在 Windows 环境下,如果要自己编译 Node.js 的源代码,需要先安装 Visual Studio,并设置好环境变量。然后,可以运行 vcbuild.bat 脚本来编译源代码,生成 Node.js 可执行文件和库文件等。

2023-04-24 23:30:49 167 1

原创 一文说尽 CORS

跨域请求是指从一个Web页面发出的请求,而且其目标资源与当前页面不同源。同源是指协议、域名和端口号都相同,而不仅仅是域名相同。如果使用的协议、端口或域名有一个不同,它们就被视为不同源,默认不可以进行跨域访问。

2023-04-15 21:00:09 59 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除