【问题标题】:What happens when multiple requests come to server当多个请求到达服务器时会发生什么
【发布时间】:2019-10-10 12:43:29
【问题描述】:

我不确定这个话题。我会试着用例子来解释。

假设,我在 php 网络服务器上有一个付款方式。首先,方法检查是否有未付款的订单。如果是,请向银行服务器发送请求以从信用卡中收费。

现在,客户端向服务器发送了两个连续的请求。当第一个请求等待银行服务器响应收费时,第二个请求来自相同的方法。如果从同一个客户端发送请求或从另一个客户端发送第二个请求,Web 服务器会做什么?我认为在相同的客户上,应该将它们整理好,这样就没有问题了。但是在不同的客户上?会不会有两次刷卡的bug?

另外,在 java、go 或 node.js 服务器上会发生什么?该处理程序系统如何在多线程或单线程语言上工作?

不要关注付款方式。这只是一个例子。

【问题讨论】:

    标签: php operating-system httprequest fpm single-threaded


    【解决方案1】:

    即使同一用户从新选项卡发出请求,Web 服务器也会启动一个新线程。 (一般来说。虽然有些假想的服务器可以在单线程队列中执行它们,但通常它们是多线程的,不关心用户)所以,请求是同时执行的。

    您有责任注意同步。因此,虽然 php 是一种单线程语言,但在编写脚本时,请始终牢记另一个实例,否则您的脚本可以并行运行。

    例如,如果脚本正在读写文件,它们应该锁定文件。 (见flock

    执行对数据库的查询时,它们必须在事务中完成。 (例如,参见START TRANSACTION, ROLLBACK, COMMIT,另见SELECT ... FOR UPDATE)。

    即例如付款可能是这样的

      START TRANSACTION; -- starts the transaction
      SELECT needed, data FROM table_with_payments FOR UPDATE; 
      -- any other script selecting these rows will be locked until this one release the transaction
      UPDATE table_with_payments WHERE this = that ... ; -- update 
      COMMIT; -- ends transaction, applying all the changes at once
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多