Как обеспечить упорядоченный результат обработки обратных вызовов websocket? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть приложение, которое прослушивает конечную точку веб-сокета, обрабатывает полученные от нее данные и сохраняет их в базе данных .

Проблема состояния гонкивозникает, когда два обратных вызова вызываются одновременно (например, одна задача может начать обработку, затем другая задача может начать обработку и обновление базы данных, затем первая задача может обновить базу данных - таким образом, в конце концов обновления базы данных вышли из строя).

Решение Я думал о том, чтобы записать точное время вызова обратного вызова, обработать данные, затем прикрепить время к данным, переданным в базу данных, ив базе данных сравните это время с последним временем обновления и действуйте соответственно. Одна возможная проблема Я думал о том, что время может быть записано не по порядку (например: рассмотрим сценарий, когда вызывается первый обратный вызов, затем вызывается второй обратный вызов, и записывается время, затемвремя записывается для первого обратного вызова).

Как бы вы сделали это правильно?Решения этой проблемы или другие способы ее решения?

РЕДАКТИРОВАТЬ : Чтобы быть более конкретным, поскольку я намерен, чтобы программа работала в режиме реального времени, насколько это возможно, яХотелось бы разрешить обработку самого современного обратного вызова без задержки (не дожидаясь полной обработки всех предыдущих обратных вызовов), но чтобы гарантировать, что конечный результат обработки (как записано в базе данных) придерживаетсяв порядке поступления обратных вызовов (не поврежден)

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете сделать так, чтобы обратный вызов обработчика данных возвращал обещание, когда оно закончится.

Каждый раз, когда вы получаете новые данные из сокета, дождитесь этого обещания, прежде чем обрабатывать его, затем сохраните полученное обещание для следующегоданные для ожидания.

Это будет выглядеть так:

const ready = Promise.resolve();

socket.on(..., data => {
  ready = ready.then(() => processData(data);
});

Это не повлияет на любой другой код.

РЕДАКТИРОВАТЬ :Чтобы сделать дорогую работу вне замка, вы можете написать

socket.on(..., data => {
  const result = doExpensiveWork(data); // Returns a promise
  ready = Promise.all(result, ready).then(([result]) => insertData(result));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...