本文为初探消息队列,并对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
- 创建集群
- 新增Topic
- 编写生产者逻辑
- 编写消费者逻辑
基本概念
一个集群(Cluster, 物理集群)可以建立多个不同的Topic(逻辑队列)。生产者将业务消息发送到Topic中,消费者消费Topic中的信息。还有一个概念叫消费者组,不同消费者组的进度互不干涉。如何将不同消费者分到不同的消费者组,可以根据业务手动分配,但这样不够灵活,如果一个客户链接挂掉,会导致资源浪费。所以会有自动分配方法,根据用户数量实时分配不同Partition给不同的消费者组,也就是负载均衡。
每一个Topic中,有不同Partition,每块Partition内部中通过offset来定位具体消息的位置。每个分片有数据复制的副本,如果宕机,副本便会派上用处。
从一条消息的角度来看如何提高吞吐量或者稳定性
- 多个消息批量发送,减少IO次数,加强发送能力
- 有数据压缩支持,比如已有支持Snappy,Gzip,LZ4等压缩算法。通过压缩,减少数据大小
- 顺序写,以提高写入效率
- 消费者方面可以复杂均衡
缺点
缺点啊是不可避免的,比如
- 数据复制问题:会导致负载均衡和节点压力大的问题
- 副本会浪费存储空间。
- 重启操作,leader切换慢,重启完成后需要leader回切,会导致大量无意义工作和海量读写请求,需要负载均衡。
- 替换、扩容和缩容,操作复杂,切换期间节点压力大,运维成本高。
- 负载不均衡:会带来数据复制的问题,进入死循环
总之,缺点如下,
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Chche
- Controller和Coordinator和Broker在同一进程中,大量IO会导致其性能下降。