Kafka对于分布式应用的作用

我们结合Kafka的特点

1、数据存储在磁盘上,保留时间可以自行设定

首先磁盘是廉价的,这样我们就能通过Kafka集群存储足够多的数据。而且我们可以设置数据保留合适时间,在消费之后能够被删除,从而及时释放磁盘空间。这里我们可以看出,Kafka能够作为分布式存储使用。分布式存储器还有HDFS,那Kafka和HDFS相比有什么特殊的呢?看下一个特点

2、顺序读写磁盘

数据通过Kafka存储到磁盘是通过顺序写来完成,读也是顺序来读,所以其读写效率极高,任何读写操作,其时间消耗都是确定、并且很快的。另一方面,在每个分区中消息的顺序是确定的,这种顺序在很多方案的设计中都能起到辅助设计的作用。这是HDFS不能比的,所以通常使用Kafka作为流处理系统的消息输入层。另外,kafka数据被消费时,其消费offset由消费者自行维护,也就是说consumer可以从任一位置加载kafka数据,这也是hdfs不能提供的。

3、Partition分区

在分布式计算引擎在加载Kafka topic数据进行计算时,对应一个kafka partition一个task去处理。在这种情况下,如果kafka分区数设置合理,那么下游的计算引擎加载处理时就无需重分区repartitoin动作,这样的话就可以避免shuffle这样代价比较大的操作,从而提高处理效率。这里我觉得有一个思想是边缘计算,也就是充分发挥每个组件最大的作用,也就是能在上游完成的操作就在上游完成,使在整个pipeline中均衡计算难度,这样计算引擎的压力便小很多。

4、数据生产(Producer)和数据消费(Consumer)分离

这一特性便能解耦系统的生产与消费模块。类似一个MQ,使得不同系统之间无需同步进行操作。这与当前类似订单及仓储系统使用的消息队列很相似。分布式系统之间的同步从始至终都是一个不大好解决而又越不过去的问题。消息队列在分布式系统同步问题上所起的作用,值得好好探究。

5、容错与负载均衡

Kafka上的数据通过配置副本数进行备份并分布式存储,多副本的存在是保证数据可用性的基础(可用性可以理解为保证数据读写访问随时能够进行)。partition分区是存储在不同的broker上的,kafka使多个broker上的分区分开承担leader的角色,从而将读写压力均衡地分布到全部的broker上。

6、消息确认机制

kafka提供可选的消息推送确认机制,使得可以在效率和可靠性之间进行trade-off,在Producer将消息推送至kafka partition时,是将消息写入到partition leader,然后partition follower异步拉取。在进行ACK确认时分几种情况,分别是发送出去即可、leader确认即可、或leader及配置的follower数均确认,表示发送成功。这给了不同应用很大的灵活性,根据需求进行选择,在性能和可靠性之间取舍。

7、传输一致性

三种情况。分别是at most once、at least once、exactly once。在接收消息—>提交偏移—>处理消息,如果在处理消息过程中出现错误,那么重新加载处理会从存储的偏移开始,这样便会出现数据丢失的情况,但也能保证最多一次。若是使用接收消息—>处理消息—>提交偏移,如果处理消息失败,此刻偏移并未被记录,就还是从之前记录偏移开始重新处理,那么就会有数据被重复处理。在kafka 0.11.0.0及以后的版本中Kafka Stream API提供了对exactly once的支持,其原理是幂等API+事务,关于这点后边的文章再详细讨论。

8、总结

基于以上些特点,使得kafka非常适合充当大数据流处理系统中的一环------数据传输层,并且其很多实现方式和原理都值得在分布式应用中参考和借鉴。

发布了95 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43878293/article/details/103817845