前言:最近公司业务一直在整kafka相关,但是相关知识很久没接触,有点遗忘。看了看网上的,大多都是spring-kafka,但是mentor给的是直接依靠apache-kafka依赖实现,好不容易搞明白,参照文章,但是导师说:会出现丢包问题,后面使用的是spring-kafka,卑微重新修改代码。
添加依赖
1.pom文件
导入maven文件的包
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
2.配置相关
在yaml文件相关中添加项目运行时kafka的相关配置,如 producer生产者的键值对的序列化、运行地址、发送时机;同理customer的相关配置。
spring:
kafka:
bootstrap-servers: 172.16.39.227:9092 #指定kafka server的地址,集群配多个,中间,逗号隔开
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
batch-size: 16384 #消息累计到batch-size的值后,才会发送消息
properties:
linger:
ms: 10 #消息未达到batch-size 但达到指定毫秒后发送消息
consumer:
group-id: ky-launch-activation-online #默认群组ID
# 客户端收到消息后,在处理消息前自动提交,这样kafka就认为consumer已经消费过了,偏移量增加
enable-auto-commit: true
auto-commit-interval: 500
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
业务处理
1.消费数据
创建consuemr消费组,对kafka组件信息进行消费。
整个文件具体代码如下所示:
@Component
public class JsonMusicSunoConsumer {
Logger logger = LoggerFactory.getLogger(JsonMusicSunoConsumer.class);
@Resource
private MusicLoadCsvService musicLoadCsvService;
@KafkaListener(topics = {KafkaTopic.MUSIC_SUNO_CONTINUE}, concurrency = "3", groupId = "ky-recommend-backend-new")
public void sunoCron(ConsumerRecord<?, ?> record) {
String message = null;
try {
message = (String) record.value();
MusicSunoKafka musicSunoKafka = JSON.parseObject(message, MusicSunoKafka.class);
if (Objects.isNull(musicSunoKafka)) {
logger.warn("JsonMusicSunoConsumer#sunoCron, parse json failed, record: {}", message);
return ;
}
musicLoadCsvService.submitForKafkaWork(musicSunoKafka);
} catch (Exception e) {
logger.error("JsonMusicSunoConsumer#handler, handler record err, record: {}, errMsg: {}",
message, e.getMessage(), e);
}
}
}
重点讲解kafka相关的,其余均为具体业务信息。
@KafkaListener(topics = {KafkaTopic.MUSIC_SUNO_CONTINUE}, concurrency = "3", groupId = "ky-recommend-backend-new")
- @KafkaListener:这是一个元注解,用于标记方法作为 Kafka 消息监听器。
- topics:指定要监听的 Kafka 主题。在这个例子中,它使用了一个字符串数组,其中包含一个元素 KafkaTopic.MUSIC_SUNO_CONTINUE,即要监听的主题名。
- concurrency:指定并发处理消息的数量。在这个例子中,它被设置为 “3”,表示同时处理3个消息。
- groupId:指定消费者组的ID。消费者组是一组共享相同消费逻辑的消费者的集合。在这个例子中,消费者组ID被设置为 “ky-recommend-backend-new”。
2.发送信息
我这里通过的是新建立一个路由函数进行测试。测试的方法有很多种,都可以实施。
这里通过路由进行测试,在任何一个webController中添加你需要的测试的函数,然后发送,下方提供我编写时需要的业务数据。
@Resource
KafkaTemplate<String, Object> kafkaTemplate;
@PostMapping("/test")
@ResponseBody
public Result<Object> ProcessKafka(HttpServletRequest request){
Environment env = getEnvironment(request);
String value = " {\"id\":1,\"prompt\":\"Apeacefulmorninginthecountryside\",\"desc\":\"Inspiredbythetranquilityofrurallife,withchirpingbirdsandrustlingleaves.\",\"diy_lrc\":\"Verse1:\\nWakinguptothegentlebreeze,\\nFieldsofgreenasfarastheeyecansee.\\nChirpingbirdssingtheirsweetmelodies,\\nInthispeacefulmorning,Ifeelfree.\\n\\nChorus:\\nOh,whatabeautifulday,\\nInthecountrysidewhereI'llstay.\\nWitheverybreath,Ifindmyway,\\nToalifeofpeaceandserenity.\\n\\n...\",\"diy_music_name\":\"MorningSerenity\"," +
"\"assign_uid\":123456,\"source_url\":\"https://example.com/countryside.mp3\",\"status\":0,\"reason\":\"\",\"music_id\":0,\"create_time\":1648486800,\"update_time\":1648519200}";
kafkaTemplate.send("music_suno_continue",value);
// MusicSunoKafka musicSunoKafka = JSON.parseObject(value, MusicSunoKafka.class);
// musicLoadCsvService.submitForKafkaWork(musicSunoKafka);
logger.info("CsvLoadController#ProcessKafka, process kafka and storage success, request: {}, env: {}", request, env);
return build(ErrorCode.OK);
然后启动整个项目,在postman中发送请求。