Na požádání zde je nástin našeho problému a způsob, jak jsme jej vyřešili:
V našem systému jsme vytvořili vlastní rutinu zamykání dokumentů (pomocí redis-locku), přičemž následující nastalo v tomto přesném (nesprávném) pořadí:
NESPRÁVNÉ POŘADÍ OPERACÍ:
- Požadavek klienta přijat
- Dokument je uzamčen
- Dokument byl načten
- Dokument upraven
- Dokument odemčen
- Požadavek klienta vyřešen
- Dokument byl uložen
Jakmile to uvidíte napsané, problém je zřejmý:ukládali jsme naše dokumenty mimo zámek dokumentů.
Předpokládejme, že #6 trvá v našem systému 100 ms. To je 100 ms okno, ve kterém pokud jakýkoli jiný požadavek zachytí stejný dokument, dojde ke konfliktu při ukládání (chyba s názvem v této otázce je v podstatě IMHO konflikt při ukládání).
Jinými slovy/příklad:v našem systému žádost A převzala verzi 1 dokumentu X, upravila ji a pak odemkla, ale než žádost A dokument uložila, žádost B uchopil dokument X a zvýšil jej na verzi 2 (přečtěte si na Mongo verze pro více informací). Poté požadavek A vyřeší svůj požadavek klienta a přejde k uložení dokumentu X, ale pokouší se uložit verzi 1 a nyní vidí, že má verzi 2, a tedy chybu výše.
Takže oprava je snadná. Uložte své dokumenty do zámku. (Ve výše uvedeném příkladu přesuňte #7 před #5. Viz níže.)
SPRÁVNÉ/Pevné POŘADÍ OPERACÍ
- Požadavek klienta přijat
- Dokument je uzamčen
- Dokument byl načten
- Dokument upraven
- Dokument byl uložen
- Dokument odemčen
- Požadavek klienta vyřešen
(Mohli byste argumentovat, že #6 a #7 by se měly zaměnit, ale to je mimo rozsah Mongo/Mongoose/tato otázka.)
Nechám tuto otázku na chvíli bez odpovědi a uvidíme, jestli někdo může vrhnout nějaké světlo na lepší způsob, jak izolovat příslušný kód a vyřešit tento problém. V našem případě to byl velmi systémový problém a VELMI náročné na řešení pro naši tehdejší úroveň dovedností.