kafka| 青训营笔记

28 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

1.消息队列的应用场景有哪些?

异步处理,应用解耦,流量削锋和消息通讯

2.Kafka的哪些Feature让其可以支撑大吞吐写入的场景?

  • Zero Copy(零拷贝)技术
  • Page Cache(页缓存)+磁盘顺序写
  • 分区分段+索引
  • 批量读写
  • 批量压缩

3.Kafka Consumer Rebalance的流程简述?

新的consumer加入到组的过程如下:

  1. consumer 首先会寻找负责该 consumer grouo 是由哪个节点的 Coordinator 负责
  2. 在获取到节点后,consumer 向 Coordinator 发送加入请求
  3. Coordinator 会为每个 consumer 分配 id 号,并从中选择出 leader 角色
  4. consumer 收到响应后,发现自己被选择为 leader 角色,会执行分区算法,将该topic的分区怎么分配给这个 group 的成员。然后将分配结果发送给Coordinator
  5. 如果是follower角色,那么向Coordinator发送请求获取该自己的分区分配结果。

4.BMQ相比较Kafka有哪些优势?

5.RocketMQ有哪些特有的Feature?

  • 削峰填谷(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题)
  • 系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死)
  • 提升性能(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统)
  • 蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开来压测)

6.RocketMQ事务消息处理流程简述?

image.png

7.你认为MQ后面应该如何发展?(开放题)

事务消息

首先服务 A 发送一个半事务消息(也称 half 消息)至 MQ 中。为什么要先发送一个 half 消息呢?这是为了保证服务 A 和 MQ 之间的通信正常,如果无法正常通信,则服务 A 可以直接返回一个异常,也就不用处理后面的逻辑的了。

如果 half 消息发送成功,MQ 收到这个 half 消息后,会返回一个 success 响应给服务 A。

服务 A 接收到 MQ 返回的 success 响应后,开始处理本地的业务逻辑,并提交本地事务。

如果服务 A 本地事务提交成功,则会向 MQ 中发送 commit,表示将 half 消息提交,MQ 就会执行第 5 步操作;如果服务 A 本地事务提交失败,则直接回滚本地事务,并向 MQ 中发送 rollback,表示将之前的 half 消息进行回滚,MQ 接收到 rollback 消息后,就会将 half 消息删除。

如果 commit,则将 half 消息写入到磁盘。

如果 MQ 长时间没有接收到 commit 或者 rollback 消息,例如:服务 A 在处理本地业务时宕机了,或者发送的 commit、rollback 因为在弱网环境,数据丢失了。那么 MQ 就会在一定时间后尝试调用服务 A 提供的一个接口,通过这个接口来判断 half 消息的状态。所以服务 A 提供的接口,需要实现的业务逻辑是:通过数据库中对应数据的状态来判断,之前的 half 消息对应的业务是否执行成功。如果 MQ 从这个接口中得知 half 消息执行成功了,那么 MQ 就会将 half 消息持久化到本地磁盘,如果得知没有执行成功,那么就会将 half 消息删除。

服务 B 从 MQ 中消费到对应的消息。

服务 B 处理本地业务逻辑,然后提交本地事务。