文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
消息队列应用场景:
通过异步处理提高系统性能(减少响应所需时间)
削峰/限流
降低系统耦合性
消息队列对比
Kafka:
- 追求高吞吐量,一开始用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务,大型公司可以选用。
- 如果有日志采集功能,肯定首选 Kafka。
RocketMQ:
- 天生为金融互联网领域而生,对于可靠性要求很高的场景。 - 尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况。
- RoketMQ 在稳定性上可能更值得信赖。 - 这些业务场景在阿里双 11 已经经历了多次考验,如果业务有上述并发场景,建议选择 RocketMQ。
RabbitMQ:
- 结合 Erlang 语言本身的并发优势,性能较好,社区活跃度也比较高,但是不利于做二次开发和维护。
- 不过 RabbitMQ 的社区十分活跃,可以解决开发过程中遇到的 Bug。
- 如果数据量没有那么大,小公司优先选择功能比较完备的 RabbitMQ。
基础知识
版本号
版本命名:
Scala 2.11 - kafka_2.11-2.1.1
前面的版本号是编译 Kafka 源代码的 Scala 编译器版本。Kafka 服务器端的代码完全由 Scala 语言编写,Scala 同时支持面向对象编程和函数式编程。
真正的 Kafka 版本号实际上是 2.1.1。
前面的 2 表示大版本号,即 Major Version;中间的 1 表示小版本号或次版本号,即 Minor Version;最后的 1 表示修订版本号,也就是 Patch 号。
为什么吞吐量大、速度快?
顺序读写:
Kafka的message是不断追加到本地磁盘文件末尾的,而不是随机的写入。
Page Cache:
通过操作系统的Page Cache,Kafka的读写操作基本上是基于内存的,读写速度得到了极大的提升。
零拷贝,批量读写,批量压缩。
分区分段+索引:
Kafka的message是按topic分类存储的,topic中的数据又是按照一个一个的partition即分区存储到不同broker节点。
每个partition对应了操作系统上的一个文件夹,partition实际上又是按照segment分段存储的。
Kafka又默认为分段后的数据文件建立了索引文件,就是文件系统上的
.index
文件。
基本概念
主题:
- Topic主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
分区:
- Partition,一个有序不变的消息序列,每个主题下可以有多个分区。
消息位移:
- Offset,表示分区中每条消息的位置信息,是一个单调递增切不变的值。
副本:
- Replica,进行数据冗余。
生产者:
- Producer,向主题发送新消息的应用程序。
消费者:
- Consumer,从主题订阅新消息的应用程序。
消费者位移:
- Consumer Offset,表征消费者消费进度。
消费者组:
- Consumer Group,多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐量。
HW
HW (High Watermark)
俗称高水位,它标识了一个特定的消息偏移量(
offset
),消费者只能拉取到这个
offset
之前的消息。
LEO
LEO (Log End Offset),标识当前日志文件中下一条待写入的消息的offset。
上图中offset为9的位置即为当前日志文件的 LEO,LEO 的大小相当于当前日志分区中最后一条消息的offset值加1。
分区 ISR 集合中的每个副本都会维护自身的 LEO,而 ISR 集合中最小的 LEO 即为分区的 HW,对消费者而言只能消费 HW 之前的消息。
消息模型
版权归原作者 程序员清风 所有, 如有侵权,请联系我们删除。