青训营笔记 - 初探消息队列

85 阅读3分钟

本文为初探消息队列,并对Kafka做初步了解。消息队列(MQ),指保存消息的一个容器,本质是一个队列,但这个队列,需要支持高吞吐、高并发,并且还得高可用。

发展历程

  • 1985 TIB,服务于金融机构和新闻机构
  • 1993 IBM的消息队列
  • 1997 M & S的MSMQ
  • 2021 JMS,本质上是一套 Java API
  • 2004 AMQP/RabbitMQ
  • 2010 Kafka
  • 2011 RocketMQ
  • 2012 Pulsar

应用场景

常用于搜搜服务、直播服务、订单服务、支付服务,应对用户的搜搜、点赞、评论等信息。

  • 防止宕机丢失处理信息
  • 缓冲区
  • 异步操作

Kafka相关

大名鼎鼎的Kafka,就是一个分布式的,分区的,多副本的日志提交服务,在高吞吐场景下发挥较为出色。

如何使用Kafka

  1. 创建集群
  2. 新增Topic
  3. 编写生产者逻辑
  4. 编写消费者逻辑

基本概念

一个集群(Cluster, 物理集群)可以建立多个不同的Topic(逻辑队列)。生产者将业务消息发送到Topic中,消费者消费Topic中的信息。还有一个概念叫消费者组,不同消费者组的进度互不干涉。如何将不同消费者分到不同的消费者组,可以根据业务手动分配,但这样不够灵活,如果一个客户链接挂掉,会导致资源浪费。所以会有自动分配方法,根据用户数量实时分配不同Partition给不同的消费者组,也就是负载均衡。

每一个Topic中,有不同Partition,每块Partition内部中通过offset来定位具体消息的位置。每个分片有数据复制的副本,如果宕机,副本便会派上用处。

从一条消息的角度来看如何提高吞吐量或者稳定性

  • 多个消息批量发送,减少IO次数,加强发送能力
  • 有数据压缩支持,比如已有支持Snappy,Gzip,LZ4等压缩算法。通过压缩,减少数据大小
  • 顺序写,以提高写入效率
  • 消费者方面可以复杂均衡

缺点

缺点啊是不可避免的,比如

  • 数据复制问题:会导致负载均衡和节点压力大的问题
    • 副本会浪费存储空间。
    • 重启操作,leader切换慢,重启完成后需要leader回切,会导致大量无意义工作和海量读写请求,需要负载均衡。
    • 替换、扩容和缩容,操作复杂,切换期间节点压力大,运维成本高。
  • 负载不均衡:会带来数据复制的问题,进入死循环

总之,缺点如下,

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