我的内存(array
服务器端)中有一个nodejs
,我每10秒钟更新一次,还有一个客户端每10秒钟进行一次请求。该请求解析array
以获取特定的字符串格式。另外,更新过程是在setInterval
函数中进行的。
我想对该端点进行压力测试。我以为如果将解析array
到字符串的过程移到我要更新array
的地方,那么仅服务将返回一个字符串(如缓存),而压力测试将不会要解决的问题。
这里,我的问题是:如果更新我的array
和解析所需的时间太长,直到为缓存的字符串分配新值,那么客户端将从服务中收到一个不正确的值因为它会继续更新。所以我的问题是我如何确定客户将始终获得正确的价值。也就是说,在这种情况下如何避免竞争状态。
答案 0 :(得分:1)
好消息是;除非您已生成工作线程或其他进程,否则节点是单线程的。因此,在正常情况下,Node几乎不可能遇到竞争条件。
但是,从您的描述看来,您似乎担心http请求的异步性质。
客户端向服务器发出请求
服务器开始工作
经过10秒(服务器仍在工作)
由于服务器未正常工作,客户端使用过时的信息向服务器发出了另一个请求。
服务器返回旧数据,但现在为时已晚。
幸运的是,还有更多的好消息。 Javascript具有对异步编程的内置支持。通常,您会将请求包装在promise中,以避免此类陷阱。结果是这样的过程:
客户端向服务器发出请求
服务器开始工作
客户端等待服务器返回,然后继续
服务器完成工作并将数据返回给客户端
客户端向服务器发送另一个请求(无限)
您还可以使自己的Promises看起来像是通过新的(-ish)异步函数习惯使用的同步编程。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function