来自:架构师社区
作者:陌北有棵树,一线互联网资深高级JAVA工程师,热爱研究开源技术,架构师社区合伙人
目前市面上各种中间件层出不穷,我们在做具体的选型时难免会纠结,在这里阐述点粗浅的看法,其实每个中间件在其设计上,都有其独有的特点或优化点,这些恰好应该是我们所关注的,这样才能做到物尽其用,将其特性发挥到最大;同时还要了解它们各自的劣势,这主要为了避坑。各种中间件就像是积木,我们能做的,就是选择合适形状的积木,搭出需要的房子。
不得不说Kafka这块积木,既能做消息中间件削峰解耦,又能做实时流处理,数据业务两手抓,真可谓上得厅堂,下得厨房。所以Kafka系列的第一篇,想先从它的应用场景分别出发,说说是哪些技术和原理支撑了它的技术特性。
所有的消息以“有序日志“的方式存储,生产者将消息发布到末端(可理解为追加),消费者从某个逻辑位按序读取。
【场景一】消息中间件
在选择消息中间件时,我们的主要关注点有:性能、消息的可靠性,顺序性。
1.性能
关于Kafka的高性能,主要是因为它在实现上利用了操作系统一些底层的优化技术,尽管作为写业务代码的程序员,这些底层知识也是需要了解的。

【优化一】零拷贝
这是Kafka在消费者端的优化,我们通过两张图来比较一下传统方式与零拷贝方式的区别:


【优化二】顺序写入磁盘

【优化三】内存映射
【优化四】批量压缩
2.可靠性
Kafka的副本机制是保证其可靠性的核心。
关于副本机制,我将它理解为Leader-Follower机制,就是多个服务器中有相同数据的多个副本,并且划分的粒度是分区。很明显,这样的策略就有下面几个问题必须解决:
request.required.acks来设置数据的可靠性:

分区机制和副本机制知识点:

3.顺序性
顺序性保证主要依赖于分区机制 + 偏移量。
提到分区,首先就要解释一下相关的概念以及他们之间的关系,个人总结如下几点:
服务器(Broker):指一个独立的服务器
主题(Topic):消息的逻辑分类,可跨Broker
分区(Partition):消息的物理分类,基本的存储单元
这里盗一张图阐述上述概念间的关系

【场景二】流处理
在0.10版本后,Kafka内置了流处理框架API——Kafka Streams,一个基于Kafka的流式处理类库,它利用了上述,至此,Kafka也就随之发展成为一个囊括消息系统、存储系统、流处理系统的中央式的流处理平台。
与已有的Spark Streaming平台不同的是,Spark Streaming或Flink是一个是一个系统架构,而Kafka Streams属于一个库。Kafka Streams秉承简单的设计原则,优势体现在运维上。同时Kafka Streams保持了上面提到的所有特性。
关于二者适合的应用场景,已有大佬给出了结论,就不强行总结了。
参考
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/810/viewspace-3142622/ ,如需转载,请注明出处,否则将追究法律责任。