使用bcrypt.compareSync替代异步bcrypt.compare有何弊端?会阻塞Node.js吗?
bcrypt同步/异步对比方法疑问解答
Node.js主线程采用单事件循环模型,所有同步执行的JS代码、CPU密集型运算都会阻塞整个事件循环,直到当前任务执行完成,期间不会处理任何其他请求、IO事件、定时器回调等逻辑,基于这个前提我们逐一解答相关疑问:
1. 使用bcrypt.compareSync()替代异步版本的核心弊端
- 会直接阻塞Node.js主线程:bcrypt本身是为了抗暴力破解设计的慢哈希算法,算力消耗极高,默认配置下单次
compareSync运算耗时通常在几十到几百毫秒区间,这段时间内整个Node服务会完全卡住。 - 仅适合无并发需求的场景:只有本地运行的一次性脚本、单用户本地工具类不需要处理并发请求的场景可以考虑用同步方法,只要是对外提供服务的后端服务,绝对不要在请求处理链路中调用任何bcrypt同步方法。
2. 同步方法返回结果正确,为什么还要使用Promise封装的bcrypt.compare()
bcrypt的异步实现是把哈希计算逻辑放到Node.js的底层线程池里执行,不会占用主线程的事件循环资源:
- 计算过程中主线程可以正常处理其他用户请求、响应其他IO事件,完全不会阻塞服务运行
- 异步版本的返回结果和同步版本100%一致,仅执行调度逻辑不同,不存在结果准确性的差异
3. 同步方法是否会导致Node.js无法响应其他用户请求
是,一定会。只要在请求处理逻辑里调用了bcrypt.compareSync(),在该方法执行完成之前,所有新的用户请求都会被挂起,用户侧会出现请求超时、服务无响应的情况。如果服务QPS稍高,频繁调用同步方法会直接导致服务雪崩,所有请求都会排队阻塞。
内容的提问来源于stack exchange,提问作者damdafayton
相关产品推荐
相关产品推荐

