Kafka批量消息发送

Kafka批量消息发送

1、pom.xml

xml 复制代码
<!-- 引入spring-kafka的依赖 -->
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

2、application.properties 配置

properties 复制代码
# Kafka 配置参数
ecp.sim.kafka.topic=sim-topic

# Spring Kafka Producer 批量发送配置
spring.kafka.bootstrap-servers=192.168.0.191:9092,192.168.0.192:9092,192.168.0.193:9092
spring.kafka.producer.retries=3
spring.kafka.producer.batch-size=16384
spring.kafka.producer.buffer-memory=33554432
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.acks=1

# Spring Kafka Consumer 批量消费配置
spring.kafka.consumer.group-id=simulator-group
spring.kafka.consumer.enable-auto-commit=false
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.max-poll-records=500
spring.kafka.listener.type=batch
spring.kafka.listener.ack-mode=manual

3、生产者和消费者

3.1、生产者

java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.UUID;

/**
 * Kafka 生产者实现,支持批量发送
 */
@Service
public class KafkaProducerImpl {

    private static final Logger logger = LoggerFactory.getLogger(KafkaProducerImpl.class);

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    /**
     * 发送单条消息
     *
     * @param topic 目标 topic
     * @param message 消息内容
     */
    public void sendMessage(String topic, String message) {
        // TODO 消息ID需要处理一下,保证全局唯一
        String messageId = UUID.randomUUID().toString();
        logger.info("发送单条消息, topic: {}, messageId: {}, message: {}", topic, messageId, message);
        kafkaTemplate.send(topic, messageId, message);
    }

    /**
     * 批量发送消息
     *
     * @param topic 目标 topic
     * @param messages 消息列表
     */
    public void sendMessagesBatch(String topic, List<String> messages) {
        if (messages == null || messages.isEmpty()) {
            return;
        }
        logger.info("批量发送消息, topic: {}, 数量: {}", topic, messages.size());
        for (String message : messages) {
            // TODO 消息ID需要处理一下,保证全局唯一
            String messageId = UUID.randomUUID().toString();
            kafkaTemplate.send(topic, messageId, message);
        }
    }
}

3.2、消费者

java 复制代码
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.Acknowledgment;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Kafka 消费者实现,支持批量消费
 */
@Service
public class KafkaConsumerImpl {

    private static final Logger logger = LoggerFactory.getLogger(KafkaConsumerImpl.class);

    /**
     * 批量消费消息
     *
     * @param records 消息记录列表
     * @param acknowledgment 手动提交 ack
     */
    @KafkaListener(topics = "${ecp.sim.kafka.topic:sim-topic}", containerFactory = "kafkaListenerContainerFactory")
    public void consumeBatch(List<ConsumerRecord<String, String>> records, Acknowledgment acknowledgment) {
        if (records == null || records.isEmpty()) {
            return;
        }
        logger.info("开始批量消费消息, 本批次数量: {}", records.size());
        
        try {
            for (ConsumerRecord<String, String> record : records) {
                logger.info("消费单条消息: topic = {}, partition = {}, offset = {}, key = {}, value = {}",
                        record.topic(), record.partition(), record.offset(), record.key(), record.value());
                // TODO: 添加实际的业务处理逻辑
            }
            
            // 业务处理成功后手动提交 offset
            if (acknowledgment != null) {
                acknowledgment.acknowledge();
                logger.info("本批次消息消费成功, offset 已提交");
            }
        } catch (Exception e) {
            logger.error("批量消费消息时发生异常", e);
            // 发生异常时可以根据业务需求决定是否重试、记录死信队列或不提交 ack
        }
    }
}
相关推荐
考虑考虑6 小时前
图片居中
java·后端·java ee
有梦想的攻城狮6 小时前
java中的EnumSet使用详解
java·set·bitset·enumset
逆境不可逃6 小时前
【后端新手谈13】VO、BO、PO、DO、DTO:Java 分层开发的 5 大核心数据对象
java·开发语言
qq_5470261796 小时前
Java 中的 Caffeine 缓存详解
java·开发语言·缓存
沐雪轻挽萤6 小时前
15. C++17新特性-std::string_view
java·开发语言·c++
devilnumber7 小时前
java的NIO框架Netty、Mina、Grizzly 和 Jetty 四种对比
java·nio·java面试·jetty
努力进修7 小时前
【java-数据结构】Java优先级队列揭秘:堆的力量让数据处理飞起来
java·开发语言·数据结构
亚历克斯神7 小时前
Java 代码质量与静态分析:2026 实战指南
java·spring·微服务
@hhr7 小时前
使用java对接火山方舟doubao-seedance-1.5-pro 模型进行视频生成
java·python·音视频
廋到被风吹走7 小时前
【LangChain4j】Java 生态中最灵活、功能最强大的纯 Java 大模型应用开发框架(支持声明式@AiService与复杂RAG/Agent)
java·开发语言·python