代码之家  ›  专栏  ›  技术社区  ›  Teho

NodeJs服务器如何处理并发请求?(关于数据库端的问题)

  •  0
  • Teho  · 技术社区  · 3 年前

    这些天,我需要编写一个序列号生成器API。逻辑很简单。每次向API发送http请求时,API都会返回一个连续的序列号。简单的伪代码如下所示:

    1. 读取数据库中保存的最后一个数字,定义为lastNumber
    2. lastNumber加1,并将其返回给客户端。

    然后,我问了一些关于并发性的问题。如果发送了多个请求 同时,对于生成器API,会发生什么? 我思考的问题如下:

    1. 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。

    我不知道交易机制是否是我问题答案的一部分。

    这些问题可能没有得到明确的解决。如果您需要澄清,请随时提出。我会尽力详细说明。谢谢!~

    0 回复  |  直到 3 年前