1

ich eine ASP.NET-Anwendung haben, mit NGINX als Server und Servicestack 3.Synchronisierte Anfragen erzwungen von ServiceStack 3 Konfiguration

Wenn es Anfragen stellen, ich sie synchron verarbeitet werden möchten, wie sie kommen von dem NGINX-Server in Servicestack (niemals müssen mehrere Anfragen gleichzeitig bearbeitet werden, da dies dazu führen könnte, dass sie ihren Job in einer anderen Reihenfolge als die, in der sie aufgerufen wurden, beenden). Wie ich es verstehe, ist es möglich, die Anzahl der Threads zu steuern, die für eingehende Anfragen verwendet werden. Wenn ich diese Zahl auf 1 beschränken könnte, würde ich mir vorstellen, dass ich das gewünschte Ergebnis erzielen würde.

Wie würde ich das erreichen, ausgehend von der ServiceStack-Konfiguration (wenn es überhaupt möglich ist - the accepted response from this question is making me think it isn't; aber wenn das stimmt, wie soll ich die Synchronisation erzwingen)?

Antwort

2

Es ist unwahrscheinlich, dass Sie den gesamten HTTP-Server blockieren möchten, was dazu führen könnte, dass alle anderen Anfragen fehlschlagen.

Haben Sie gerade versucht, eine Singleton-Sperre zu verwenden? z.B. Sie könnten die Art des Dienstes für diese verwenden:

lock (typeof(MyService)) 
{ 
} 

Aber in einem Web-Server wie diese Sperren im Allgemeinen eine schlechte Idee ist, Sie verwenden eine Art von optimistischen Concurrency Control denken sollte, wenn er einen Fehler wirft, wenn sie versuchen um einen veralteten Datensatz zu aktualisieren. z.B. In OrmLite können Sie RowVersion feature for optimistic concurrency verwenden, wo Clients die RowVersion senden, die den Status des Datensatzes darstellt und wenn sie aktualisiert wurde, da OrmLite einen wirft, der in ServiceStack automatisch in eine HTTP-Fehlerantwort konvertiert wird.

+0

Ja, Singleton-Sperre ist möglich; Ich wollte dies nur durch die Konfiguration von Servicestack zum Laufen bringen. Danke, dass Sie mir von optimistischer Nebenläufigkeit erzählt haben, ich werde mich darum kümmern; Die Sache ist, ich will nicht, dass Fehler geworfen werden. Was ich möchte, ist, dass meine PUT-Anfragen in der Reihenfolge, in der sie kommen, bedient werden und aufeinander in einer Warteschlange warten. – Claudiu

+1

@Claudiu ist es eine sehr schlechte Idee, HTTP-Server-Anfragen sperren, Sperren wie oben kann Queue Requests, aber das hilft nicht, wenn die in der Warteschlange befindlichen Anfragen auf modifizierte/veraltete Daten arbeiten, weshalb optimistische Nebenläufigkeit ist wichtig. Es klingt wie das, was Sie wirklich wollen, ist ein MQ zu verwenden, wo Anfragen FIFO ausgeführt werden und Sie können es für die Verwendung eines einzelnen Threads konfigurieren, so dass sie nacheinander ausgeführt werden, ohne die Infrastrukturressourcen zu sperren und den Systemdurchsatz stark zu beeinträchtigen. – mythz

+0

Ja, die Dinge werden jetzt ein bisschen klarer; Ich denke [RedisMQ] (http://docs.servicestack.net/redis-mq#easily-testable-and-swappable) ist die Lösung für mein Problem! Es sagt sogar so weiter [Servicestacks Concurrency Model-Kapitel] (http://docs.servicestack.net/concurrency-model). Einige weitere ziemlich gute Erklärungen von Redis [hier] (https://stackoverflow.com/questions/1777103/what-nosql-solutions-are-out-there-for-net/2760282#2760282). Vielen Dank, @mythz! – Claudiu