基本概念

消息队列常见使用场景
- 异步
提高接口响应时间,耗时的流程用队列去异步做。 - 削峰
每年的双十一,淘宝的很多活动都在 0 点的时候开启,大部分应用系统流 量会在瞬间猛增,这个时候如果没有缓冲机制,不可能承受住短时大流量 的冲 击 。通过利用消息队列,把大量的请求暂存起来,分散到相对长的一段时间内 处理,能大大提高系统的稳定性和用户体验。 - 解耦
复杂的应用里会存在多个子系统,比如在电商应用中有订单系统、库存系统、物流系统 、 支付系统等。这个时候如果各个子系统之间的搞合性太高,整体系统的可用性就会大幅降低。多个低错误率的子系统强精合在一起,得到的 是一个高错误率的整体系统。
- 消息分发
在大数据时代,数据对很多公司来说就像金矿,公司需要依赖对数据的分析,进行用户画像 、精准推送、流程优化等各种操作,并且对处理的实时性要 求越来越高。数据是不断产生的,各个分析团队、算法团队都要依赖这些数据 来进行工作,这个时候有个可持久化的消息队列就非常重要。数据的产生方只需要把各自的数据写人一个消息队列即可数据使用方根据各自需求订阅感兴趣的数据。
kafka基本概念与术语
发布订阅模型
发布订阅模型(publish/subscribe,或简称为pub/sub),发布者将消息生产出来发送到指定的 topic中,所有订阅了该 topic的订阅者都可以接收到该topic下的所有消息。通常具有相同订阅 topic的所有订阅者将接收到同样的消息。
- topic:一个 topic可以理解为逻辑语义相近的消息的容器。
- 发布者( publisher):生产者
- 订阅者( subscriber):消费者

消息
kafka中消息由很多部分组成,Kafka消息格式共经历过3次变迁,它们被分别称为V0,V1和V2版本。图例为V1版本的消息格式。
我们只需要知道消息主要由三部分组成。
- Key:消息键,对消息做 partition时使用,即决定消息被保存在某 topIc下的哪个 partition
- Value:消息体,保存实际的消息数据。
- Timestamp:消息发送时间戳,用于流式处理及其他依赖时间的处理语义。如果不指定则取当前时间。

topic/partition
这张来自Kaka官网的 topic和 partition关系图非常清楚地表明了它们二者之间的关系:
topic是由多个 partition组成的,而Kaka的 partition是不可修改的有序消息序列,也可以说是有序的消息日志。每个 partition有自己专属的 partition号,通常是从0开始的。用户对partition唯一能做的操作就是在消息序列的尾部追加写入消息。 partition上的每条消息都会被分配一个唯一序列号(offset)。

offset
前面说过, topic partition下的每条消息都被分配一个位移值。实际上,Kaka消费者端也有位移( offset)的概念,但一定要注意这两个offset属于不同的概念。
通过 topic、 partition和 offset,我们可以在Kaka集群中找到唯一对应的那条消息。

replica
replica在kafka中称为副本,是分区日志的备份。
副本分为两类
- 领导者副本( leader replica)
- 追随者副本( follower replica):不提供服务给客户端的,也就是说不负责响应客户端发来的消息写入和消息消费请求。它只是被动地向领导者副本( leader replica)获取数据,而一旦 leader replica所在的broker宕机, Kafka会从剩余的 replica中选举出新的 leader继续提供服务。

ISR
ISR的全称是 in-sync replica,翻译过来就是与leader replica保持同步的replica集合。
参考书籍
Apache kafka实战
Kafka权威指南