Możesz spojrzeć na metodę dwufazowego zatwierdzania z MongoDB, lub możesz całkowicie zapomnieć o transakcjach i oddzielić swoje procesy za pomocą podejścia magistrali usług. Przykładem może być Amazon - pozwolą na przesłanie zamówienia, ale nie potwierdzą go, dopóki nie będą w stanie zabezpieczyć swojego ekwipunku, nie obciążą karty itp. Żadna z tych sytuacji nie występuje w pojedynczej transakcji - jest to szereg kroków, które mogą występować oddzielnie i mogą w razie potrzeby mieć zastosowane kroki kompensacyjne.
Naiwny realizacja autobus wykonaj następujące czynności (należy pamiętać, że jest to tylko ogólna sugestia, aby pracować i dokładna realizacja będzie zależeć od konkretnych potrzeb dla współbieżności, etc.):
- połóż zamówienie w kolejce. W tym momencie możesz nadal czekać na klienta, lub możesz podziękować im za zamówienie i poinformować ich, że otrzymają wiadomość e-mail po przetworzeniu jej przez .
- "Pracownik magazynu" złapie zamówienie i zablokuje inwentarz przedmiotów, które musi zarezerwować. Można to zrobić na wiele różnych sposobów: . Za pomocą Mongo możesz utworzyć kolekcję, która ma dokument dla każdego zamówienia. Ten dokument będzie miał identyfikator ID elementu magazynu i TTL, który jest rozsądny (powiedzmy 30 sekund).Dopóki robotnik ma zamek, może on zarządzać poziomami zapasów przedmiotów, dla których ma blokady. Po wprowadzeniu zmian przez użytkownika może on usunąć dokument "zablokowany".
- Jeśli pojawi się inny pracownik, który chce zarządzać tym samym przedmiotem , gdy jest zablokowany, można przełączyć zablokowanego pracownika w tryb uśpienia na przez X sekund, a następnie ponowić próbę lub, jeszcze lepiej, ponownie złożyć wniosek na autobus komunikacyjny zostanie odebrany później przez innego pracownika .
- Gdy pracownik został rozwiązany wszystkich pozycji zapasów, to wtedy można miejsce kolejny komunikat na magistrali usługowej, która wskazuje kartę powinna być naładowana, czy przetwarzanie powinno otrzymać powiadomienie ciągnąć wykazie lub e-mail może być wysłane do osoby, która wykonała zamówienie itp., itp.,
Brzmi skomplikowanie, ale gdy już skonfigurujesz magistralę komunikatów, jest ona względnie prosta. A list of Node Message Bus Implementations can be found here.
Niektórzy deweloperzy całkowicie pomijają formalną magistralę komunikatów i używają bazy danych jako silnika przekazującego wiadomości, który może pracować w prostych implementacjach. Google Mongo i Queues.
Jeśli nie spodziewasz się więcej niż jednego serwera, a implementacja magistrali komunikatów jest zbyt duża, węzeł może obsłużyć blokowanie i przekazywanie wiadomości. Na przykład, jeśli naprawdę chcesz zablokować za pomocą węzła, możesz utworzyć tablicę przechowującą identyfikatory elementów magazynu. Chociaż, szczerze mówiąc, myślę, że autobus z wiadomościami to najlepsza droga. W każdym razie, oto kod, którego używałem w przeszłości do obsługi prostego zewnętrznego blokowania zasobów za pomocą Node.
// attempt to take out a lock, if the lock exists, then place the callback into the array.
this.getLock = function(id, cb) {
if(locks[id]) {
locks[id].push(cb);
return false;
}
else {
locks[id] = [];
return true;
}
};
// call freelock when done
this.freeLock = function(that, id) {
async.forEach(locks[id], function(item, callback) {
item.apply(that,[id]);
callback();
}, function(err){
if(err) {
// do something on error
}
locks[id] = null;
});
};
Pan spojrzał na MongoDB-sugerowanej dwufazowe podejście opisane [tutaj] (http://cookbook.mongodb.org/patterns/perform-two-phase-commits/)? – JohnnyHK