2015-04-08 8 views
21

KeyedMessage<String, byte[]> keyedMessage = new KeyedMessage<String, byte[]>(request.getRequestTopicName(),SerializationUtils.serialize(message)); producer.send(keyedMessage);Ob Schlüssel als Teil des Senden Nachricht in kafka

Zur Zeit erforderlich sind, ich Nachricht als Teil der verschlüsselten Nachricht erhalten, ohne Schlüssel schickt, wird es noch mit delete.retention.ms arbeitet, muß ich Schlüssel als Teil der Nachricht senden? Ist das gut, Schlüssel als Teil der Nachricht zu machen

Antwort

49

Schlüssel sind meistens nützlich/notwendig, wenn Sie starke Ordnung für einen Schlüssel benötigen und etwas wie eine Zustandsmaschine entwickeln. Wenn Sie möchten, dass Nachrichten mit demselben Schlüssel (z. B. eine eindeutige ID) immer in der richtigen Reihenfolge angezeigt werden, wird durch das Hinzufügen eines Schlüssels zu Nachrichten sichergestellt, dass Nachrichten mit demselben Schlüssel immer an dieselbe Partition in einem Thema gesendet werden. Kafka garantiert die Reihenfolge innerhalb einer Partition, aber nicht über die Partitionen hinweg in einem Thema, so dass alternativ kein Schlüssel zur Verfügung gestellt wird - was zu einer Round-Robin-Verteilung über die Partitionen hinweg führt - diese Reihenfolge wird nicht beibehalten.

Bei einer Zustandsmaschine können Schlüssel mit log.cleaner.enable verwendet werden, um Einträge mit demselben Schlüssel zu deduplizieren. In diesem Fall geht Kafka davon aus, dass sich Ihre Anwendung nur um die letzte Instanz eines bestimmten Schlüssels kümmert und der Protokollreiniger ältere Duplikate eines bestimmten Schlüssels nur dann löscht, wenn der Schlüssel nicht null ist. Diese Form der Rundholzverdichtung wird durch die Eigenschaft log.cleaner.delete.retention gesteuert und erfordert Schlüssel.

Alternativ dazu können Sie die allgemeinere Eigenschaft log.retention.hours, die standardmäßig aktiviert ist, löschen, indem Sie vollständige veraltete Protokollabschnitte löschen. In diesem Fall müssen keine Schlüssel bereitgestellt werden. Kafka löscht nur Teile des Logs, die älter sind als der angegebene Aufbewahrungszeitraum.

Das ist alles zu sagen, wenn Sie log compaction aktiviert haben oder strenge Reihenfolge für Nachrichten mit dem gleichen Schlüssel erfordern, dann sollten Sie auf jeden Fall Schlüssel verwenden. Andernfalls bieten Nullschlüssel möglicherweise eine bessere Verteilung und verhindern potenzielle Hot Spotting-Probleme in Fällen, in denen einige Schlüssel mehr als andere angezeigt werden.

+0

Ich bin neu bei Kafka, das ist der Grund, so viele Fragen zu stellen: Es gibt ein paar Fragen dazu: Erste Frage, können wir die Nachricht auf der Schlüsselbasis konsumieren, zZ nehme ich Nachricht von MessagAndMetadata mm. oder ist es in Ordnung, Schlüssel zum Zeitpunkt der konsumierenden Nachricht zu ignorieren. Ich benutze hig Level Consumer API. – gaurav

+0

@kuujo Ich gehe davon aus, dass diese Deduplizierung nur für Log-Einträge ist, es nicht notwendigerweise Duplikate Nachrichten in einer Themen-Warteschlange? – user1658296

+0

Schöne Antwort. Ich bin damit verbunden. Ich schreibe für ein "Best Practice" -Dokument, an dem ich arbeite (ich arbeite unter anderem für eine Firma, die sich in Kafka integriert). Das hat mir geholfen, das Problem zu verstehen, danke. –