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
        }
    }
}
相关推荐
莫得感情 o1 小时前
并发 14 · 收官:虚拟线程与结构化并发
java·并发
聚美智数1 小时前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库
xierui1231232 小时前
AI Agent 隐私架构:本地化重点为什么是登录态与执行权限
java·人工智能·网络安全·架构
cfm_29142 小时前
Spring AI Tool 调用架构全解
java·人工智能·spring
sun༒2 小时前
Spring @Scheduled 定时任务详解:Cron表达式、执行顺序、优先级与并行调度
java·后端·spring
一次旅行2 小时前
DeepSeek‑V4‑Flash‑Vision‑Exp 小白入门实战|3种传图方式、完整可跑代码、避坑排障
java·前端·人工智能
野生技术架构师3 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
AI人工智能+电脑小能手3 小时前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
奥莱维3 小时前
KNX酒店方案_KNX专用线与高端酒店技术逻辑
java·服务器·前端·数据库
工业一体机老司机3 小时前
Linux工业一体机自启动服务配置:systemd服务单元编写与开机优化实战
java·linux·服务器