2016-10-21 2 views
6

Ich benutze Kafka und wir haben einen Anwendungsfall, um ein fehlertolerantes System zu erstellen, wo nicht einmal eine einzige Nachricht verpasst werden sollte. So, hier ist das Problem: Wenn Publishing zu Kafka aus irgendeinem Grund fehlschlägt (ZooKeeper down, Kafka Broker usw.) wie können wir diese Nachrichten robust handhaben und sie wieder abspielen, sobald die Dinge wieder zurück sind. Wie gesagt, wir können uns nicht einmal einen einzigen Nachrichtenausfall leisten. Ein weiterer Anwendungsfall ist, dass wir zu jedem beliebigen Zeitpunkt wissen müssen, wie viele Nachrichten aus irgendeinem Grund an Kafka nicht veröffentlicht wurden, d. H. Etwas wie Zählerfunktionalität, und diese Nachrichten müssen nun erneut veröffentlicht werden.Wie Kafka Publishing-Fehler in robuster Weise behandelt werden

Eine der Lösungen ist, diese Nachrichten in eine Datenbank zu pushen (wie Cassandra, wo Schreibvorgänge sehr schnell sind, aber wir brauchen auch Zählerfunktionalität und ich denke, dass die Cassandra-Zählerfunktion nicht so gut ist und wir diese nicht verwenden wollen.), die mit dieser Art von Ladung umgehen können und uns auch eine sehr genaue Zählereinrichtung zur Verfügung stellen.

Diese Frage ist mehr aus der Architektur Perspektive und dann welche Technologie zu verwenden, um das zu ermöglichen.

PS: Wir behandeln einige wie 3000TPS. Wenn also der Systemstart fehlschlägt, können diese fehlgeschlagenen Nachrichten in sehr kurzer Zeit sehr schnell wachsen. Wir verwenden Java-basierte Frameworks.

Danke für Ihre Hilfe!

Antwort

4

Der Grund, warum Kafka auf eine verteilte, fehlertolerante Art und Weise gebaut wurde, ist die Behandlung von Problemen genau wie Ihre. Mehrere Instanzen von Kernkomponenten sollten Serviceunterbrechungen vermeiden. Um einen veralteten Zookeeper zu vermeiden, stellen Sie mindestens 3 Instanzen von Zookeepern bereit (wenn dies in AWS geschieht, stellen Sie sie in verschiedenen Verfügbarkeitszonen bereit). Um Broker-Fehler zu vermeiden, stellen Sie mehrere Broker bereit und stellen Sie sicher, dass Sie in Ihrer Producer-bootstrap.servers-Eigenschaft mehrere Broker angeben. Stellen Sie sicher, dass die acks=all-Eigenschaft im Producer festgelegt ist, um sicherzustellen, dass der Kafka-Cluster Ihre Nachricht dauerhaft geschrieben hat. Dies bestätigt einen Client-Schreibvorgang, wenn alle synchronisierten Replikate den Empfang der Nachricht bestätigen (auf Kosten des Durchsatzes). Sie können Warteschlangenlimits auch festlegen, um sicherzustellen, dass bei Schreibvorgängen auf dem Broker eine Ausnahme abgefangen und behandelt und möglicherweise erneut versucht wird.

Mit Cassandra (ein weiteres gut durchdachtes, verteiltes, fehlertolerantes System), um Ihre Schreibvorgänge zu "inszenieren", scheint es Ihrer Architektur keine Zuverlässigkeit hinzuzufügen, erhöht aber die Komplexität, und Cassandra wurde nicht geschrieben eine Nachrichtenwarteschlange für eine Nachrichtenwarteschlange würde ich dies vermeiden.

Richtig konfiguriert, sollte Kafka verfügbar sein, um alle Ihre Nachrichten Schreibvorgänge und bieten geeignete Garantien.

+0

Danke Chris! Ich verstehe, dass Kafka so konzipiert wurde, um mit einer solchen Situation fertig zu werden. Aber dies als ein Argument zu sagen, dass die Dinge immer so funktionieren, wie es soll, ist eine kühne Aussage und für mich ist es früher oder später zum Scheitern verurteilt.Nur um Ihnen ein Beispiel zu geben, obwohl Sie genug Broker und genug Zookeper-Instanzen haben, können die Dinge immer noch außer Kontrolle geraten. Zum Beispiel: Wenn ein Thema 3 Replikate hat und min.insync.replicas auf 2 gesetzt ist, wird das Schreiben auf den Broker nur dann erfolgreich sein, wenn 2 von 3 Repliken synchron sind. Wenn in diesem Fall das Replikat nicht synchronisiert ist, wird keine neue Anfrage akzeptiert. – Coder

+0

@Coder Dies könnte ein hilfreiches Blog sein, um sicherzustellen, dass Ihr Cluster richtig konfiguriert ist, um Ihre nacheilenden Replikate als Mitglieder der ISR zu behalten: http://www.confluent.io/blog/handsfree-kafka-replication-a -lesson-in-operational-simplicity/ –

+0

Danke @Chris das ist nützlich! – Coder

2

Chris sagte bereits, wie man das System fehlertolerant hält.

Kafka unterstützt standardmäßig at-least once Semantik der Nachrichtenübermittlung, es bedeutet, wenn es versucht, eine Nachricht zu senden, geschieht etwas, es wird versuchen, es erneut zu senden.

Wenn Sie eine Kafka Producer Eigenschaften erstellen, können Sie diese konfigurieren, indem retries Option mehr als 0.

Properties props = new Properties(); 
props.put("bootstrap.servers", "localhost:4242"); 
props.put("acks", "all"); 
props.put("retries", 0); 
props.put("batch.size", 16384); 
props.put("linger.ms", 1); 
props.put("buffer.memory", 33554432); 
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 

Producer<String, String> producer = new KafkaProducer<>(props); 

Für weitere Informationen this überprüfen.

+1

Danke @ Shankar. Es gibt im Wesentlichen zwei Arten von Fehlern, die wiederholbar und nicht wiederholbar sind. Diese Eigenschaft zum erneuten Versuch ist nur hilfreich, wenn ein wiederholbarer Fehler vorliegt. Zum Beispiel, wenn ein Fehler von einem Broker kommt, als der Anführer unterging und zooKeeper damit beschäftigt ist, einen neuen Anführer usw. zu vergeben. Solche Arten von Fehlern sind wiederholbar und die obige Eigenschaft wird funktionieren. Aber wenn es ein nicht wiederholbares gibt, egal wie hoch wir dieses Eigentum setzen, wird es nicht funktionieren. Danke für die Eingabe! – Coder

+0

@Coder: Danke für die Eingaben .. können Sie mir bitte mitteilen, was sind diese nicht rückführbaren Fehler? – Shankar

Verwandte Themen