2013-04-02 1 views
3

Я денормализовал некоторые из данных, хранящихся в MongoDB, ради сокращения времени чтения. Это нужно обновлять, когда я выполняю операцию записи, чтобы он соответствовал базовым данным.Принудительный одиночный писатель базы данных в узле + Mongo

Чтобы избежать каких-либо условий гонки, я хочу, чтобы это было сделано в фоновом задании, которое было бы однопоточным. В Java я просто бросаю объекты Command в очередь и обрабатываю их по отдельности. Но в узле, всякий раз, когда я выполняю какую-либо операцию с БД, это произойдет асинхронно, и поэтому я остаюсь с проблемой состояния гонки.

Пример того, что я хочу сделать:

Применение темы

  1. Вставить новый "Bid"
  2. Поместите объект "BidPlaced" на очереди

фона Нить

  1. Pop "BidPlaced"
  2. Найти max (Цена) от всех торгов. Обновите Auction.highestBid.

Я все еще склоняюсь к модели параллелизма узла (в случае, если вы не могли сказать!). Как я могу добиться чего-то подобного в Node.js.

+1

Я не понял вопрос хорошо, однако один способ выполнения вещи в определенном порядке использование узла - «выполнить» следующую задачу в обратном вызове предыдущей задачи. Поэтому, когда заканчивается первый асинхронный вызов, его обратный вызов вызывается, и вы можете запустить следующую «задачу» из этого обратного вызова. Я считаю, что другой способ - использовать EvenEmitters. Например, когда «ставка поставлена», вы выбрасываете событие. Также вы должны определить слушателя для этих событий, чтобы выполнить «Обновить Auction.highestBid». События автоматически помещаются в очередь, поэтому вам не нужно определять явную очередь – balafi

ответ

0

У меня есть подобное приложение, где я использую child_process раскошелиться фоновые задания так:

  1. Вставить новый «Bid»
  2. Помещенный «BidPlaced» объект на очереди

затем Я отправил бы дочернему процессу следующую заявку в очереди:

// Application Thread 
var child = cp.fork('the background thread module'); 
child.send(nextBid); 

На фоне нить прослушивания сообщения:

// Background Thread 
process.on('message', function(bid) { 
    // Do your background work 
    process.send(bid); 
}); 

Тогда прислушайтесь к завершению фона в программе:

// Application Thread 
child.on('message', function(lastBid) { 
    // Check the queue and do it again 
}); 
Смежные вопросы