2016-10-06 2 views
1

Ich bin bereit, einen Client für cassandra db zu verwenden, also muss ich es initialisieren, wie:Zustand im Controller beibehalten?

client = CQEx.Client.new! 

ich zwei Routen erstellt haben, dass Punkte auf Aktionen in einem Controller zu lesen und zu schreiben.

Die Frage ist, wie würde ich den Client nur einmal initialisieren und es jedes Mal in den Aktionen des Controllers verwenden?

Soll ich einen GenServer erstellen und ihm Nachrichten von Controlleraktionen senden? damit ich den cassandra client im GenServer pflegen kann?

Soll ich den Client jedes Mal erstellen, wenn ich die Aktion ausführe ?!

Was ist der Rat hier?

+0

GenServer vs neue Client jedes Mal hängt vollständig von Ihren Anforderungen ab, wie viele gleichzeitige Anfragen Sie behandeln möchten und wie teuer die Erstellung einer neuen Cassandra-Verbindung ist. Vielleicht möchten Sie auch einen Verbindungspool mit poolboy wie Ecto verwenden, siehe https://github.com/elixir-ecto/db_connection und https://github.com/devinus/poolboy. – Dogbert

+0

Ich muss Tausende von gleichzeitigen Anfragen behandeln, ich denke, ich habe mich selbst beantwortet? :) Warum nicht eine 'Task' für jede Lese- oder Schreiboperation erstellen? Also wird jede Aufgabe auf einem separaten Prozess ausgeführt, ist dies ein guter Weg, dies zu tun (falls ich mich entscheide, GenServer nicht zu verwenden und jedes Mal eine Verbindung herzustellen)? – simo

+1

Warum eine Aufgabe erstellen? Jede Anforderung ist bereits ein neuer Prozess und wird gleichzeitig mit anderen Anforderungen ausgeführt. Es sei denn, Sie möchten viele Lese-/Schreibvorgänge ausführen _per request_. Wie auch immer, @tkowal scheint recht zu haben - 'cqerl' scheint bereits einen Pool von Verbindungen zu erstellen, so dass man' Client.new! 'Direkt aufrufen kann. – Dogbert

Antwort

1

Ich müsste etwas mehr graben, aber es sieht aus wie CQEx.Client.new! ist nicht tatsächlich Initialisierung Client und ist ein wenig irreführend.

Die Umsetzung https://github.com/matehat/cqex/blob/master/lib/cqex/client.ex#L7 zeigt, dass es :cqerl.get_client() ruft intern und wenn Sie einen Blick auf cqerl Bibliothek nehmen, es laicht Supervisoren whith Verbindungen, so dass es nicht notwendig sein könnte, die Gleichzeitigkeit und sicher nur get_client und Arbeit tun verwenden zu handhaben.

+0

ah, wirklich .. danke für das zeigen, – simo

+0

Wenn die Bibliothek hat eine eigene Überwachung Baum und Worker-Prozesse und Sie nur ein oder zwei Abfragen in Ihrer Aktion, wäre dies völlig redundant und verschleiern tatsächlichen Geschäftslogik. 'cqerl' hängt von' pooler' ab, also verwaltet es wahrscheinlich einen Pool von Arbeitern, die ständig verbunden sind. Wenn Sie viele gleichzeitige Abfragen in * einer * Controller-Aktion ausführen, kann dies zu einer Beschleunigung führen. Sie müssen es messen :) – tkowal

+0

Danke, eigentlich ist es nur eine Operation pro Anfrage .. – simo

Verwandte Themen