这些天,我需要编写一个序列号生成器API。逻辑很简单。每次向API发送http请求时,API都会返回一个连续的序列号。简单的伪代码如下所示:
-
读取数据库中保存的最后一个数字,定义为lastNumber
-
lastNumber加1,并将其返回给客户端。
然后,我问了一些关于并发性的问题。如果发送了多个请求
同时,对于生成器API,会发生什么?
我思考的问题如下:
-
NodeJs是一种单线程语言,一次只处理一个请求。在正常情况下,发电机应产生001、002、003。。。按顺序。当有大量请求同时发送到API时,它们是否都会从数据库中获得相同的最后一个序列号,从而返回重复的序列号?例如,多个请求同时将lastNumber读取为001,因此它们都返回002。
在阅读了许多文章之后,这篇文章帮助最大。
How, in general, does Node.js handle 10,000 concurrent requests?
有一个图表解释了nodeJs处理请求的过程
user do an action
â
v
application start processing action
âââ> make database request
âââ> do nothing until request completes
request complete
âââ> send result to user
request A ââ> make database request
request B ââ> make database request
request C ââ> make database request
database request complete ââ> send response A
database request complete ââ> send response B
database request complete ââ> send response C
我的另一个问题来了。什么算是完整的数据库请求?生成器API对数据库的请求是一读一写。读LastNumber,写LastNumber+1。当两个操作都完成时,DB请求是否完成?
因为节点是单线程,所以当数据库处理请求时,节点不会空闲。它将继续处理请求B、请求C。那么,请求B的“make DB request”会走多远?请参考下图。在我的想象中,数字是行动完成的顺序。
(1) request A ââ> make database request ââ>(4) DB handle requests (read 001) (write 002)
(2) request B ââ> make database request ââ>ï¼??)Questionsï¼ the order of process? How far will it go, then stop and wait
(3) request C ââ> make database request
(5) database request complete ââ> send response A
database request complete ââ> send response B
database request complete ââ> send response C
当(4)项未完成时,“发出数据库请求”会走多远?由于数据库中的最后一个数字需要更新为002,请求B可以成功返回003。
我不知道交易机制是否是我问题答案的一部分。
这些问题可能没有得到明确的解决。如果您需要澄清,请随时提出。我会尽力详细说明。谢谢!~