RabbitMQ,Kafka八股(自用笔记)

RabbitMQ

异步发送(验证码,短信,邮件)

MYSQL和redis,ES之间的数据同步

分布式事务

削峰填谷

生产者确认机制

publisher confirm

回调方法即时发送

记录日志

保存数据库,发送成功后删除

消息持久化

交换机持久化:第二个参数

队列持久化:durable创建持久化

消息持久化:DeliverMode指定

消费者确认

SpringAMQP 高级消息队列协议

手动ack 调用api

自动ack(常用)

none:关闭ack 投递立即删除

消息重复消费

网络抖动

消费者挂了

1.每条消息设置唯一id

2.幂等:分布式锁,数据库锁(悲观锁,乐观锁)

死信交换机

延迟队列=死信交换机+TTL(消息会被延迟消费)

超时订单,限时优惠,定时发布

1.消费者使用basic.reject或basic.nack并且requeue为false

2.过期消息,超时无人消费

3.投递的消息队列满了,最早投递的成为死信

队列绑定死信交换机

TTL

消息存活时间和队列存活时间取最小值

延迟队列插件

声明交换机:设置delayed属性

消息堆积怎么解决

1.增加消费者

2.消费者开启线程池加快消息处理速度

3.扩大队列容积,提高堆积上限

惰性队列

队列声明时开启lazy

接受消息存入磁盘

消费时从磁盘读入内存

支持百万存储

高可用(集群)

普通集群(标准集群)

集群各个节点共享数据(交换机,队列元信息,不包含消息信息)

队列所在节点传递到当前节点返回

队列所在节点宕机,消息丢失

镜像集群(主从模式)

交换机、队列、消息会在镜像节点同步备份

创建队列的节点主节点,备份节点镜像节点

一个队列的主节点可能是另一个队列的镜像节点

主宕机,镜像成为新的主

仲裁集群(主从模式)

功能同镜像集群

主从同步基于Raft,强一致(.quorum)

Kafka

数据不丢失

1.生产者到Brocker

设置异步发送(传入一个回调函数,处理回调的结果)

消息重试(设置重试次数)

2.Brocker消息存储

发送确认机制acks

acks = 0 速度最快,不等待服务器响应

acks = 1(默认)集群首领节点响应

acks = all 所有赋值节点全部接收到,统一响应一个成功

3.消费者接收

分区机制:一个主题多个分区

分区消息只能由消费者组中唯一一个消费者处理,

不同分区分给不同消费者(但是同一个消费者组)

重平衡:消费者个数变化,分区个数变化触发

消费者默认提交自动按期提交消费偏移量(5s提交一次)

重平衡可能会重复消费或丢失数据

同步+异步提交:

Finally里使用同步提交是为了保证最后一次消费记录不会丢失

只发生在关闭消费者的时候,其他时候都是异步提交

消费的顺序性

同一个分区消息由消费者组中唯一消费者消费,

保证Topic的一个分区顺序处理,不保证跨分区

发送消息时指定分区号

相同业务相同key(分区默认通过key的hashcode选择分区)

高可用机制(集群,分区备份机制)

分区备份机制:

一个topic多个分区,每个分区有多个副本

其中一个leader,其余follower(副本),副本存储到不同的broker

leader故障,follower升级leader

leader

同步复制保存的follower为ISR

异步复制保存的follower为普通follower

选举原则:

优先从ISR选leader,没有则从普通follower

文件存储机制

.index 索引文件

.log 数据文件

.timeindex 时间索引文件

分段

便于删除无用文件

查找数据方便

数据清理机制

超过保存时间清理(自动触发)

日志文件(.log文件)超过一定阈值,删除最久消息(手动开启)

实现高性能

消息分区(多台服务器)

顺序读写(磁盘顺序读写)

页缓存(对内存访问)

零拷贝(上下文切换(用户内核),减少数据拷贝)

消息压缩(磁盘io,网络io)

分批发送(打包批量发送)

页缓存

磁盘->页缓存->网卡->消费者

省去了页缓存到kafka,kafka到socket缓冲区,缓冲区复制到网卡

### 比较RabbitMQKafka消息队列系统的特征差异与应用场景 #### 特征对比 RabbitMQKafka 虽然都能用于构建可靠的消息传递解决方案,但在设计哲学和技术细节上存在显著区别。 - **架构模式** RabbitMQ 是基于 AMQP 协议的传统消息代理(Broker),采用点对点或发布订阅模型来处理消息路由。而 Kafka 则是一个分布式的流平台,支持高吞吐量的日志记录以及实时数据管道建设[^2]。 - **持久化机制** RabbitMQ 默认情况下不提供磁盘级别的持久存储选项,除非配置 Exchange 或 Queue 的特定参数启用此功能。相比之下,Kafka 将所有消息都保存到硬盘,并通过分区复制确保即使发生节点故障也不会丢失数据[^1]。 - **消费方式** 在 RabbitMQ 中消费者可以直接连接至目标队列获取新到达的信息;而在 Kafka 架构里,客户端应用程序通常会先订阅某个主题(Topic),之后再从该 Topic 下指定的时间戳位置开始读取消息批次[^4]。 - **扩展性和性能表现** 对于大规模集群环境下的横向扩容需求而言,Kafka 显示出了明显优势——它能够轻松应对每秒数百万条记录的输入输出速率而不影响整体稳定性。与此同时,在低延迟场景下两者各有千秋:如果追求极致的速度则可能倾向于选择像 ZeroMQ 这样的轻量化方案;而对于大多数企业级应用来说,Kafka 凭借其优秀的批处理能力和压缩算法同样能满足苛刻的服务级别协议(SLA)[^5]。 #### 应用案例分析 鉴于上述技术特点的不同之处: - 当业务逻辑较为复杂且涉及多种不同类型的任务调度时,可以选择 RabbitMQ 来简化开发流程并提高灵活性; - 如果项目侧重于海量事件追踪、监控预警或是ETL(Extract Transform Load)作业,则建议优先考虑使用 Apache Kafka 实现高效的数据采集与传输过程[^3]。 ```python # Python示例代码片段展示如何创建简单的Kafka生产者和消费者程序 from kafka import KafkaProducer, KafkaConsumer producer = KafkaProducer(bootstrap_servers='localhost:9092') consumer = KafkaConsumer('my-topic', bootstrap_servers='localhost:9092') for msg in consumer: print(f"Received message {msg.value.decode()}") producer.send('my-topic', b'some_message_bytes') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值