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