补充下mq作用:
解耦合,异步, 削峰限流
key.serializer
和value.serializer 序列化器
producer
consumer
broker : kafka实例,运行在一个机器上
主题(topic) :
分区:类似队列 ,且消息有序
一个broker上会有不同的分区
一个分区会有主从副本 ,主副本只会有一个,存在于某台broker上
生产这可以使用方法 template.send( key , value) , key用于指定分区
已提交
的位置是已安全保存的最后偏移量,如果进程失败或重新启动时,消费者将恢复到这个偏移量。消费者可以选择定期自动提交偏移量,也可以选择通过调用commit API来手动的控制(如:commitSync
和 commitAsync
偏移量,消费者组(⚠️
发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费。(分区会被分配给消费者组中的唯一消费者)
这样,一个分区的消费者都是不同组的
分区的作用就是提供负载均衡的能力 .
Kafka生产者的分区策略。所谓分区策略是决定生产者将消息发送到哪个分区的算法
发现消费者故障
消费者向服务器定时发送心跳,session.timeout.ms
kafka 提供了分区多副本: leader副本, follower副本
Kafka 消息顺序消费?
对于某个topic,发送消息的时候指定 key。根据这个 key 的哈希值决定消息会被发送到哪个 Partition。
kafka消息可靠性?
1.生产者丢失消息的情况
ListenableFuture 设置回调函数
ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topic, o); future.addCallback(
result -> logger.info("生产者成功发送消息到topic:{} partition:{}的消息",
result.getRecordMetadata().topic(), result.getRecordMetadata().partition()), ex -> logger.error("生产者发送消失败,原因:{}", ex.getMessage()));
2.消费者丢失消息
先消费再提交,而且
手动提交offset(
3.kakfa丢失消息
leader挂了换leader时, 一些数据没有被 follower 副本的同步的话,就会造成消息丢失
设置 acks = all,所有 ISR 列表的副本全部收到消息时,生产者才会接收到来自服务器的响应
即任何一个副本(不在 ISR 列表中)没有成功接收到消息,生产者都不会收到成功的响应
kafka保证不重复消费
1. 消费消息服务做幂等校验
2.enable.auto.commit =false ,
开发者在代码中手动提交 offset
什么时候提交 offset 合适?业务忙的时候提交offset,但没有处理业务,而是写日志等,之后再处理
kafka可以实现幂等和事务
producer.beginTransaction(); for (int i = 0; i < 100; i++) producer.send(new ProducerRecord<>("my-topic", Integer.toString(i), Integer.toString(i))); producer.commitTransaction();
Kafka 的重试机制主要分为生产者和消费者两端。生产者通过 retries
参数控制重试次数,消费者可以通过手动管理 offset 或配合 Spring Kafka 的重试机制来处理消费失败的情况
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!