消息队列 | 青训营笔记

65 阅读3分钟

消息队列 | 青训营笔记

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

消息队列对比

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

基本概念

  • Topic:Kakfa中的逻辑队列,可以理解成每一个不同的业务场景就是一个不同的topic,对于这个业务来说,所有的数据都存储在这个topic中
  • Cluster:kafka的物理集群,每个集群中可以新建多个不同的topic
  • Producer:顾名思义,也就是消息的生产端,负责将业务消息发送到Topic当中
  • Partition:通常topic会有多个分片,不同分片直接消息是可以并发来处理的,这样提高单个Topic的吞吐
  • offset:消息在partition内的相对位置信息,可以理解唯一ID,在partition内部严格递增。也就是说,对于每个partition,每一条消息都有一个唯一的偏移量
  • Replica:分片的副本,分布在不同的机器上,可用来容灾,Leader对外服务,Follower异步去拉取leader的数据进行一个同步。如果leader挂掉,可以将Follower提升成leader在对外进行服务
  • ISR:意思是同步中的副本,对于Follower来说,始终和leader是有一定差距的,但当这个差距比较小的时候,我们就可以将这个follower副本加入到SR中,不再ISR中的副本是不允许提升成Leader的

使用Kafka

第一步:首先需要创建一个Kafka集群。

第二步:需要在这个集群中创建一个Topic,并且设置好分片数量

第三步:引入对应语言的SDK,配置好集群和Topic等参数,初始化一个生产者,调用Send方法,将你的HelloWorld发送出去

第四步:引入对应语言的SDK,配置好集群和Topic等参数,初始化一个消费者,调用Poll方法,你将收到你刚刚发送的HelloWorld

评价Kafka

  1. 运维成本高
  2. 对于负载不均衡的场景,解决方案复杂
  3. 没有自己的缓存,完全依赖Page Cache
  4. Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降

对以上两个问题进行总结。第一,因为有数据复制的问题,所以Kafka运维的时间成本和人力成本都不低;第二,对于负载不均衡的场景,我们需要有一个较为复杂的解决方案进行数据迁移,从而来权衡IO升高的问题。

除了以上两个问题以外,Kafka自身还存在其他的问题。