Kafka生产者故障转移机制和将数据推送到主题的验证

时间:2018-11-23 11:01:54

标签: java apache-kafka

我已经编写了每天将数据推送到kafka主题的代码,但是我不确定该代码是否能够解决问题。我的职责是从包含1天数据(每天早上刷新)的实时表格中推送完整数据。

我的代码将查询“从mytable中选择*”,并将其逐一推送到kafka主题,然后再推送,我需要验证/更改每一行并推送到主题。

下面是我的生产者发送代码。

    Properties configProperties = new Properties();
        configProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, sBOOTSTRAP_SERVERS_CONFIG);
        configProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
                "org.apache.kafka.common.serialization.StringSerializer");
        configProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
                "org.apache.kafka.common.serialization.StringSerializer");
        configProperties.put("acks", "all");
        configProperties.put("retries", 0);
        configProperties.put("batch.size", 15000);
        configProperties.put("linger.ms", 1);
        configProperties.put("buffer.memory", 30000000);
        @SuppressWarnings("resource")
        KafkaProducer<String, String> producer = new KafkaProducer<String, String>(configProperties);
        System.out.println("Starting Kafka producer job  " + new Date());
        producer.send(new ProducerRecord<String, String>(eventName, jsonRec.toString()), new Callback() {
            public void onCompletion(RecordMetadata metadata, Exception e) {
                if (e != null) {
                    e.printStackTrace();
                }
            }
        });

现在,我不确定在失败的情况下如何将数据再次推回主题。由于我已经从表中选择了所有记录,因此很少有失败,而且我不知道全部。

以下是我要解决的问题

  1. 如何仅处理那些未推送的记录,以避免重复记录被推送(避免冗余)。

  2. 如何验证推送的记录与表中的完全相同。我的意思是数据完整性。例如数据的大小和记录的数量。

1 个答案:

答案 0 :(得分:0)

您可以使用configProperties.put("enable.idempotence", true);-它会尝试重试失败的消息,但请确保在kafka中保存的每个记录中只有一个。请注意,这意味着retries>0 acks=allmax.in.flight.requests.per.connection> = 0。有关详细信息,请检查https://kafka.apache.org/documentation/

对于第二个问题-如果您要保存所有记录或不保存所有记录,则必须使用kafka事务处理,这会带来更多问题,我建议阅读https://www.confluent.io/blog/transactions-apache-kafka/