Есть ли способ гарантировать, что повторяющиеся записи не будут вставлены в тему кафка?

Я пытался реализовать механизм очередей с использованием kafka, где я хочу убедиться, что повторяющиеся записи не вставляются в созданную тему.

Я обнаружил, что у потребителя возможна итерация. Есть ли способ, которым мы можем сделать это и в потоке производителя?

1
0
827
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это называется однократной обработкой.

Возможно, вас заинтересует первая часть Кафка FAQ, в которой описаны некоторые подходы к тому, как избежать дублирования при производстве данных (т.е. на стороне производителя):

Exactly once semantics has two parts: avoiding duplication during data production and avoiding duplicates during data consumption.

There are two approaches to getting exactly once semantics during data production:

  1. Use a single-writer per partition and every time you get a network error check the last message in that partition to see if your last write succeeded
  2. Include a primary key (UUID or something) in the message and deduplicate on the consumer.

If you do one of these things, the log that Kafka hosts will be duplicate-free. However, reading without duplicates depends on some co-operation from the consumer too. If the consumer is periodically checkpointing its position then if it fails and restarts it will restart from the checkpointed position. Thus if the data output and the checkpoint are not written atomically it will be possible to get duplicates here as well. This problem is particular to your storage system. For example, if you are using a database you could commit these together in a transaction. The HDFS loader Camus that LinkedIn wrote does something like this for Hadoop loads. The other alternative that doesn't require a transaction is to store the offset with the data loaded and deduplicate using the topic/partition/offset combination.

I think there are two improvements that would make this a lot easier:

  1. Producer idempotence could be done automatically and much more cheaply by optionally integrating support for this on the server.
  2. The existing high-level consumer doesn't expose a lot of the more fine grained control of offsets (e.g. to reset your position). We will be working on that soon

Можем ли мы сохранить уникальность, используя уникальные ключи при добавлении записей в тему?

Shubhangi Gupta 10.09.2018 13:52

@ShubhangiGupta Это зависит от обстоятельств. Считаете ли вы два сообщения с key=1,value=a и key=2,value=a отдельными или дубликатами?

Giorgos Myrianthous 10.09.2018 14:11

Я рассматриваю это как отдельное значение так же, как и хэш-карту.

Shubhangi Gupta 10.09.2018 14:43

Поскольку вы рассматриваете эти пары «ключ-значение» как разные, то, предоставляя уникальные ключи, вы получите уникальные записи. Но будет гораздо полезнее, если вы приведете пример, потому что я все еще не уверен, чего вы пытаетесь достичь.

Giorgos Myrianthous 10.09.2018 22:37

Например, я хочу хранить записи в темах, созданных следующим образом: Если одна запись с ключом = 1 уже присутствует в теме, и если я хочу снова вставить в эту тему другую запись с ключом = 1, то ее не следует вставлять или более старое значение должно быть обновлено, как это происходит в хэш-карте.

Shubhangi Gupta 11.09.2018 07:28

Другие вопросы по теме