Jedna rzecz, która przychodzi mi do głowy, to to, że być może nie musisz wykonywać całej pracy, o której myślisz, że musisz, a Twój problem można prawdopodobnie rozwiązać z niewielką pomocą Indeksy TTL i prawdopodobnie kolekcje ograniczone . Rozważ następujące wpisy:
{ "_id" : ObjectId("531cf5f3ba53b9dd07756bb7"), "user" : "A", "units" : 50 }
{ "_id" : ObjectId("531cf622ba53b9dd07756bb9"), "user" : "B", "units" : 62 }
Więc są dwa wpisy i masz ten _id
wartość z powrotem po wstawieniu. Tak więc na początku „A” nie miał z kim grać, ale wpis „B” będzie grał przeciwko temu przed nim.
ObejctId są monotoniczne , co oznacza, że „następny” to zawsze większą wartość od ostatniego. Więc z wstawionymi danymi, po prostu zrób to:
db.moves.find({
_id: {$lt: ObjectId("531cf622ba53b9dd07756bb9") },
user: { $ne: "B" }
}).limit(1)
Daje to poprzedni wstawiony „ruch” do bieżącego ruchu, który właśnie został wykonany, i robi to, ponieważ cokolwiek który został wcześniej wstawiony będzie miał _id
z mniejszą wartością niż bieżąca pozycja. Upewniasz się również, że nie "grasz" przeciwko własnemu ruchowi użytkownika i oczywiście ograniczasz wynik tylko do jednego dokumentu.
Tak więc "ruchy" będą zawsze posuwać się do przodu. Gdy następne wstawienie zostanie wykonane przez użytkownika "C", dostanie "ruch" od użytkownika "B", a następnie użytkownik "A" otrzyma "ruch" od użytkownika "C" i tak dalej.
Wszystko, co „może” się tutaj wydarzyć, to to, że „B” tworzy następny "przesuń się" w kolejności, a podniesiesz ten sam dokument, co w ostatnim żądaniu. Ale to jest punkt dla twojego projekt „sesji”, aby zapisać ostatni „wynik” i upewnić się, że nie odzyskałeś tego samego, i jako taki zajmij się tym niezależnie od ty chcesz w swoim projekcie.
To powinno wystarczyć do „zabawy”. Ale przejdźmy do Twojego „usunięcia " część.
Oczywiście „myślisz”, że chcesz coś usunąć, ale wracając do moich początkowych „pomocników”, nie powinno to być konieczne. Z góry usuwanie staje się tylko czynnikiem „sprzątania”, więc Twoja kolekcja nie rozrasta się do ogromnych rozmiarów.
Jeśli zastosowałeś indeks TTL, w podobny sposób jak ten samouczek wyjaśnia, że wpisy kolekcji zostaną dla Ciebie wyczyszczone i usunięte po pewnym czasie.
Co można zrobić, zwłaszcza biorąc pod uwagę, że używamy rosnącego charakter _id
klucz i że jest to mniej więcej „kolejka” z natury, możesz ewentualnie zastosować to jako kolekcja ograniczona
. Możesz więc ustawić maksymalny rozmiar określający, ile „ruchów” zachowasz w dowolnym momencie.
Łącząc te dwie rzeczy razem, otrzymujesz coś, co „rośnie” tylko do określonego rozmiaru i zostanie automatycznie wyczyszczone, jeśli aktywność nieco zwolni. Dzięki temu wszystkie operacje będą szybkie .
Podsumowując, współbieżność „usuwa ", o który się martwiłeś, zostało usunięte przez faktyczne "usunięcie" potrzeby usuwania dokumentów, które właśnie zostały odtworzone. Zapytanie jest proste, a indeks TTL i kolekcja z limitami zapewniają zarządzanie danymi za Ciebie.
Oto moje zdanie na temat bardzo jednoczesnej gry „Blind War”.