2017-07-24 11 views
0

Je suis nouveau à RavenDB et j'ai passé du temps à lire les détails. Je suis un peu confus sur la façon dont le problème de la cohérence éventuelle.RavenDB et la cohérence

Supposons qu'un utilisateur d'une page Web est en train de créer quelque chose. Par exemple un nouveau "cas". (c'est-à-dire qu'une requête POST est envoyée en premier et qu'un nouveau document est créé dans RavenDB). Une fois créée, l'utilisateur est renvoyé à la vue d'ensemble des cas (c'est-à-dire qu'une requête GET extrait tous les cas en interrogeant le corbeau pour tous les documents de cas). Maintenant, d'après ce que je peux dire, je ne peux pas m'assurer que le document de cas qui vient d'être créé sera inclus dans cette requête, car l'index peut être périmé?

Pour les autres utilisateurs, il est improbable qu'ils se soucient si le cas apparaît immédiatement car ils ne sont probablement pas au courant qu'il a été créé en premier lieu, donc c'est bien. Mais l'utilisateur qui a réellement créé le cas est très susceptible d'être très confus s'il est absent de l'aperçu des cas. En d'autres termes, c'est un problème qui doit être résolu.

Comment?

Répondre

3

Vous pouvez utiliser WaitForReplicationAfterSaveChanges pour cela, voir: https://ravendb.net/docs/article-page/3.5/http/server/scaling-out/replication/write-assurance

+0

Ah ok, super! Je suppose que cela se produira plus ou moins instantanément dans des circonstances normales? Il serait bizarre que l'utilisateur attende plusieurs secondes avant que l'enregistrement soit "terminé". – jool

+0

Est-ce que 'WaitForReplicationAfterSaveChanges' attend également que les index affectés soient mis à jour ou que le document ait été répliqué sur des noeuds supplémentaires? – Omir

+0

Vous pouvez également spécifier 'WaitForIndexesAfterSaveChanges' –

0

habituellement je faisais quelque chose comme ceci:

public IQueryable<Foo> GetAllFoos(bool waitForUpdatedIndex = false) 
{ 
    IRavenQueryable<Foo> ret = _documentSession.Query<Foo>(); 

    if (waitForUpdatedIndex) 
     ret.Customize(q => q.WaitForNonStaleResultsAsOfNow()); 

    return ret; 
} 

Et puis je passerais true pour waitForUpdatedIndex si l'utilisateur a déjà ajouté un nouvel élément.

+0

Droit, je comprends votre idée. Je ne suis pas sûr que ça marchera pour moi. Cela nécessite une sorte d'information contextuelle renvoyée au client Web au cas où la prochaine demande serait traitée par un autre serveur Web. Sur le même serveur, cela peut fonctionner si je cache cette information mais encore un peu gênant. Je suppose qu'il est plus approprié pour les applications de bureau typiques où le contexte est conservé en mémoire et non isolé pour chaque demande. – jool

+0

Vous devrez peut-être le combiner avec la suggestion d'Ayende ci-dessus si vous avez plus d'un nœud RavenDB mais cela devrait fonctionner. Quelque chose comme: 'public ActionResult Créer ([Bind (Include =" ... ")] ViewModel viewModel) {if (ModelState.IsValid) {_docSession.SaveChanges (viewModel); retourner RedirectToAction (" Index ", nouveau {waitForUpdatedIndex = true});} return View (viewModel);} ' – Omir

+0

Ouais je comprends. Im n'utilisant pas MVC si (angularjs). Bien que cela soit encore possible, je ne considère pas vraiment que cette information soit appropriée pour un aller-retour sur le Web. Je veux dire en théorie, l'utilisateur devrait être en mesure de naviguer rapidement à la vue d'ensemble dans un autre navigateur Web et toujours voir le nouveau cas. – jool