2014-06-13 11 views
6

Wenn ich eine Verbindung zu meinem Elasticsearch Cluster mit ElasticSearch.NET eingerichtet, ich bin ein Codeblock wie folgt verwendet:ElasticSearch.NET Verbindung/Client-Management-Lifecycle

var uris = settingsProvider.ElasticSearchUri.Split(';').Select(x => new Uri(x)); 
var sniffingConnectionPool = new SniffingConnectionPool(uris); 
var connectionConfiguration = 
    new ConnectionConfiguration(sniffingConnectionPool) 
     .SniffOnConnectionFault() 
     .SniffOnStartup(); 
var client = new ElasticsearchClient(settings: connectionConfiguration); 

wird empfohlen, dass ich memoize/make static/mache einen Singleton-Wrapper für die ElasticsearchClient, die ConnectionConfiguration oder die SniffingConnectionPool, damit sie nicht jedes Mal neu aufgebaut werden müssen, wenn ich suche?

Antwort

0

Ich habe nichts in der Dokumentation gesehen, um etwas anderes zu empfehlen, aber im Allgemeinen würde ich auf die Seite der Vorsicht geraten und das Singleton vermeiden, da die Dokumente auch keine Versprechen über Thread-Sicherheit geben. Achten Sie darauf, alles zu entsorgen IDisposable, und wenn Sie über die Leistung oder Speicherverbrauch besorgt sind, verwenden Sie einen Profiler, um zu bestimmen, wo Sie Ihre Bemühungen zielen.

0

Wir haben festgestellt, dass bei der Verwendung des Sniffing dauert zwischen 800ms und 1.2s länger für die Suche in einem 5-Knoten-Cluster. Wir dachten, wir würden ein Singleton machen, damit wir nur einmal schnüffeln. und setze .SniffOnConnectionFault (true), wenn der Sniffing-Knoten verschwindet, wird er einen anderen auswählen, wenn ich das richtig verstehe.

Hat jemand dieses Muster verwendet und gibt es einen besseren Weg, da das Schnüffeln so langsam ist?

+0

Ist es 800 ms bei der ersten Anforderung nur oder ist es konstant 800 ms durchgeführt mehrere Anfragen? Ich habe Beiträge von Leuten gelesen, in denen erwähnt wird, dass sich der Client für die erste Anfrage aufwärmen muss, was wesentlich mehr Zeit in Anspruch nimmt. – TchiYuan