Что происходит, когда на сервер приходит несколько запросов - PullRequest
0 голосов
/ 10 октября 2019

Я не уверен в этой теме. Я попытаюсь объяснить это примерами.

Предположим, у меня есть способ оплаты на веб-сервере php. Во-первых, метод проверяет наличие неоплаченных заказов. Если да, отправьте запрос на банковские серверы для снятия средств с кредитной карты.

Теперь клиент отправил два последовательных запроса на сервер. В то время как первый запрос ожидал ответа от банковских серверов для зарядки, второй запрос пришел тем же способом. Что будут делать веб-серверы, если запросы отправляются от тех же клиентов или второй запрос отправляется от другого клиента? Я думал о тех же клиентах, они должны быть приведены в порядок, чтобы не было проблем. А на разных клиентах? Может ли быть ошибка, которая взимает плату с карты дважды?

Кроме того, что происходит на серверах java, go или node.js? Как работает эта система обработки на многопоточных или однопоточных языках?

Не фокусируйте способ оплаты. Это только пример.

1 Ответ

1 голос
/ 10 октября 2019

Даже если запрос сделан из новой вкладки тем же пользователем, веб-сервер запускает новый поток. (Это, вообще говоря. Хотя некоторые воображаемые серверы могут выполнять их в очереди в одном потоке, но обычно они являются многопоточными и не заботятся о пользователях). Таким образом, запросы выполняются одновременно.

Вы несете ответственность запозаботься о синхронизации. Итак, хотя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...