先看下kafka的整体
黑色箭头的通信采用的是TCP
协议.
Topic
kafka允许我们把一类消息归类在一起, 这就是Topic, kafka还对每个Topic进行了分区. 如下就是三个分区. 012345678这些叫做offset
, 是partition(分区)用来记录每个offset所对应的消息的. 如图, 在分区中, 消息是有序的.
生产者
生产者发布消息
- 发给Topic, 在Topic内部采用复杂均衡的模式将消息分发给各个分区.
- 发给Topic, 并且指定发送给哪个分区.
消费者
消费者所需要维护的数据, 只有其所消费的那个分区的offset. 按offset读取数据的时候, 一般来说都是按照顺序读取的, 但是消费者也可以指定offset的值, 即使这个数据已经被读取过了, 只要这个分区消息还在有效期中, 都可以被读到.
队列模式和发布/订阅模式
- 队列模式: 一组消费者消费一个Topic的消息, 每个消息只会被一个消费者给消费掉.
- 发布/订阅模式: 同一条消息会同时被多组消费者消费. 每组内可能会有一个或多个消费者, 在组内其实可以看做"队列模式", 进入组内的一条只会被一个消费者消费. 这里需要注意的是, 订阅的是组而不是个体消费者.
有序性
- 以分区顺序: 上面有说道, 每个分区内部的消息是有顺序的. 如果只有一个/组消费这个分区, 那么这个/组的消费者消费的消息就是顺序的. 这种相对下面的方式提高了并发量的上限, 但是不能保证Topic是顺序的.
- 以Topic顺序: 那么就让这个Topic只有一个分区, 并且只有一个(组)消费者去消费他. 但是随之而来的问题就是并发性能上限不高的问题.