我在NodeJS实例上使用SocketIO,只有一个连接到Redis缓存 . 此缓存用作在实时环境中维护状态的手段 .
我的前提包括由于发生大量事务而可能发生并发问题,但是,我不确定我需要考虑哪些并发问题......
我的初始设计实现了使用Lua脚本和 EVAL
(一个名为 EVAL
的脚本被认为是Redis的原子事务),以便能够检查给定键的状态,但除此之外,我不确定是否需要实现锁其他地方 .
我主要担心的是当SocketIO捕获一个连接并随后执行一个事件时,我可以保证在该事件中发生的Redis EVAL
. 具体用例:
1)客户端A发出服务器捕获的事件
2)服务器执行请求的事件,其中包括在Redis上调用 EVAL
Lua脚本
3)客户端B发出服务器捕获的事件
4)服务器执行请求的事件,其中包括在Redis上调用 EVAL
不同的Lua脚本
由于NodeJS的异步性质,我可以假设客户端A的 EVAL
将始终由客户端B之前的Redis服务器接收吗?我理解事件循环是完全错误的吗?
1 回答
答案完全取决于您的代码 . 基本上是的,对于这种类型的事件,nodejs将按照它们出现在事件循环队列中的顺序处理它们 .
但是,您说请求处理 includes 调用
EVAL
,这意味着 if 您的处理包括其他I / O(如查询持久数据库),来自客户端A的处理请求中的步骤顺序可以与处理来自客户端的请求中的步骤交错B.通常,您应该尽量避免创建一个破坏并发性的逻辑 . 如果需要以完全相同的顺序完成某些操作,请考虑创建一个处理队列(全局队列,其中下一个项目只能在上一个完成之后处理)或者在原子序列中本地化关键部分(如LUA脚本) .