消息队列 | 青训营笔记

119 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。

案例

  • 系统崩溃-->解耦
  • 服务能力有限-->削峰
  • 链路耗时长尾-->异步
  • 日志存储-->日志处理:Log-消息队列-LogStash-ES-Kibana

消息队列概述

定义

消息队列(MQ),指保存消息的一个容器,本质是个队列。

  • 需支持高吞吐
  • 高并发
  • 高可用

业界消息队列对比

  • Kafka:分布式的、分区的、多副本的日志提交服务,高吞吐场景
  • RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,实时场景
  • Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、存算分离的架构设计
  • BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群

消息队列-Kafka

  • Kafka:分布式的、分区的、多副本的日志提交服务,高吞吐场景

使用场景

搜索、直播、订单、支付

如何使用Kafka

  1. 创建Kafka集群
  2. 在集群中创建一个Topic,并设置好分片数量
  3. 编写生产者逻辑,引入对应语言的SDK,配置好集群和Topic等参数
  4. 编写消费者逻辑,引入对应语言的SDK,配置好集群和Topic等参数

基本概念

Topic:Kakfa中的逻辑队列,每一个不同的业务场景就是一个不同的topic,对于这个业务来说,所有的数据都存储在这个topic中

Cluster:Kafka的物理集群

Producer:消息的生产端,负责将业务消息发送到Topic当中

Consumer:消息的消费端,负责消费已经发送到topic中的消息

Partition:通常topic会有多个分片,不同分片直接消息是可以并发来处理的,提高单个Topic的吞吐

Kafka 架构

image.png

其他参考: Kafka 的系统架构

提高吞吐或者稳定性功能

  • Producer:批量发送、数据压缩
  • Broker:顺序写,消息索引,零拷贝
  • Consumer:Rebalance

问题总结

  • 有数据复制的问题,Kafka运维的时间成本和人力人本高
  • 对于负载不均衡的场景,我们需要有一个较为复杂的解决方案进行数据迁移,从而来权衡IO升高的问题
  • Kafka没有自己的缓存,在进行数据读取时,只有Page Cache可用,不是很灵活
  • Controller 和 Coordinator和Broker 在同一进程中,大量 IO会造成其性能下降

消息队列-BMQ

  • BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群

架构图

image.png

Broker-Partition 状态机

对于写入逻辑,还有一个状态机机制,用来保证不会出现同一个分片在两个Broker上同时启动的情况,另外也能够保证一个分片的正常运行。

Controller做好分片的分配之后,如果在该Broker分配到了Broker,首先会start这个分片,然后进入Recover状态。

消息队列- RocketMQBMQ

  • RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,实时场景

RocketMQ 架构

image.png

  • 数据流通过Producer发送给Broker集群,再由Consumer进行消费
  • Broker节点有Master和Slave的概念
  • NameServer为集群提供轻量级服务发现和路由

高级特性

  • 事务消息,库存服务和消息队列必须要是在同一个事务内的
  • 延迟消息
  • 重试和死信队列