繁体   English   中英

通过来自kafka的多个消费者消费时将数据保存到数据库

[英]Saving data to data base while consuming through multiple consumers from a kafka

我是 kafka 的新手,我面临的问题是我有 2 个消费者正在批量消费来自 kafka 主题的数据,并希望将每个消费者获取的所有数据保存到数据库中。 如何实现?
在属性文件中设置了 listner.type=batch 和 max-poll-records=500。 我已经创建了一个在服务 class 中定义的保存消息方法,并且我正在从两个消费者调用相同的方法。 保存记录时花费了太多时间。

如果你的消费者“花的时间太长”和“做的太多”,然后重新平衡消费者群体并没有取得任何进展,那么你只需要更小的批次而不是 500 个。

否则,你需要改善你的应用程序和数据库之间的网络连接,这是一个硬件问题。

如果您有两个消费者线程从 Kafka 主题消费数据并将数据保存到数据库,则可能需要很长时间,因为两个消费者线程都试图同时写入数据库。 这可能会导致数据库出现瓶颈,因为它试图同时处理多个写入请求。

提高应用程序性能的一种方法是使用批处理机制来减少写入数据库的次数。 您可以累积一批记录并一次保存所有记录,而不是在使用时保存每条记录。 这样可以大大减少写入数据库的次数,提高性能。

下面是一些示例代码,演示了如何在您的消费者中使用批处理:

final int BATCH_SIZE = 1000;

List<Record> batch = new ArrayList<>(BATCH_SIZE);

while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        batch.add(record);
        if (batch.size() >= BATCH_SIZE) {
            saveBatch(batch);
            batch.clear();
        }
    }
}

private void saveBatch(List<Record> batch) {
    // Save batch of records to database
}

在此示例中,消费者轮询记录并将它们添加到一个批处理中,直到该批处理达到所需的大小(在本例中为 1000 条记录)。 当批次已满时,将其传递给 saveBatch() 方法,该方法将批次中的所有记录一次性保存到数据库中。 然后批次被清除,过程再次开始。

以这种方式使用批处理可以减少写入数据库的次数,从而大大提高应用程序的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM