使用Java编写的应用, 可以编程开启多线程处理高并发业务场景.
而JS处理高并发场景使用的是 : 队列机制, 事件机制
因为JS在网页中运行时单线程模式, 在服务端nodejs中运行是单进程模式, 都无法像JAVA那样开启多个线程或者协程来处理高并发任务.
但是这不意味着JS无法处理高并发任务, 单进程的程序在使用队列机制(就是待处理任务一个个排队)处理高并发场景也仍然是非常高效的, 而且避免了开启多个线程的内存消耗.但是其缺点也是很明显的 : 不适合处理单个任务计算非常复杂消耗时间的场景.
举个栗子 :
想象一下生活中排队的场景, 如果前面有一个人磨磨唧唧, 半天赖在窗口各种问问题, 后面的人都要排队等着, 很着急.
而如果开启多个窗口(多线程/进程), 那些难缠的人分到一个窗口, 速度快的人分到一个窗口, 效率就大大提升了.
一个接口需要控制判断某个资源的可用额度
express接口中使用mongodb处理高并发请求
1、document中添加资源数量属性used
2、使用mongoose中自带原子属性的操作进行查询更新used字段 Model.findOneAndUpdate()
2.1、注意第二点的match字段需要带上used的筛选条件
3、判断used是否超出可用数量,然后记录已超额的对象ID
4、使用定时操作从已超额的记录中归零对应的基础对象
并发数量控制怎么实现常见的做法是建立线程池,如果线程池满了就禁止新的连接。
线程池可以看作一个令牌库。如果要运行,就需要获取一个令牌,运行完毕退回令牌。如果令牌发光了,就禁止新的运行,等待退回的令牌。