消息队列常见场景
-
系统解耦:重要操作完成后,发送消息到Kafka中,由别的服务系统来消费消息完成其他操作(将非核心业务拆分出去缩短核心业务的处理流程和时间)
-
流量削峰:一般用于秒杀或抢购活动中,缓冲系统短时间内高流量带来的压力(防止瞬间流量打崩系统)
- 异步处理:通过异步处理机制,可以把一个消息放入队列中,但不立即处理它,在需要的时候再进行处理===》比如一个消息需要传递给多个服务,这时候可以用Kafka进行分发
这样可以更快返回结果减少步骤之间的并发
消息队列的选择
吞吐量:Kafka和RocketMQ (收集日志、监控信息等大量数据)
金融类业务:RocketMQ(稳定安全、分布式部署)
轻量级:RabbitMQ(轻量级开箱即用),在生产者和队列之间增加了Exchange模块
其他因素:Kafka社区活跃,企业使用技术栈
Kafka的架构
Kafka大致分为三层:Producer(生产者),Server(中转者),Consumer(消费者),生产者发送消息,服务端负责存储消息,消费者负责拉取消息,其中服务端其实就是有由多个Broker节点组成,主题就是在Broker节点上,Topic是个逻辑概念,实际存储是Partion主题分片
- Producer:消息的产生者
- Broker:Broker 是 kafka 实例,每个服务器上有一个或多个 kafka 的实例,简单的理解就是一台 kafka 服务器,kafka cluster表示集群的意思
- Topic:消息的主题,可以理解为消息队列,kafka的数据就保存在topic。在每个 broker 上都可以创建多个 topic 。
- Partition:Topic的分区,每个 topic 可以有多个分区,分区的作用是做负载,提高 kafka 的吞吐量。同一个 topic 在不同的分区的数据是不重复的,partition 的表现形式就是一个一个的文件夹!
- Replication:每一个分区都有多个副本,副本的作用是做备胎,主分区(Leader)会将数据同步到从分区(Follower)。当主分区(Leader)故障的时候会选择一个(Follower)上位,成为 Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本
- Consumer:消息的消费方
- Consumer Group:我们可以将多个消费组组成一个消费者组,在 kafka 的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!
- Zookeeper:kafka 集群依赖 zookeeper 来保存集群的的元信息,来保证系统的可用性