Kafka由浅入深
一、前言
在项目中,我们常常需要用到消息队列中间件,主要用来解决应用耦合,异步消息,流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。使用较多的消息队列有kafka、RabbitMQ、ActiveMQ、RocketMQ。不同的消息队列都会有不同的特点和优势。本文将对 Kafka 进行浅析,并分享一套kafka重试方案。
二、消息系统介绍
2.1、什么是消息系统
消息系统是负责将消息数据从一个应用传递到另外一个应用的系统,应用只需关注于数据,无需关注数据在两个或多个应用间是如何传递的。分布式消息传递基于可靠的消息队列,在客户端应用和消息系统之间异步传递消息。目前有两种消息队列:1、点对点消息传递模式 2、发布-订阅消息传递模式
2.2、点对点传递模式
在点对点消息系统中,消息持久化到一个队列中。此时,将有一个或多个消费者消费队列中的数据。但是一条消息只能被消费一次。当一个消费者消费了队列中的某条数据之后,该条数据会从消息队列中删除。我的理解是点对点模式即只有一个消息队列专门为生产者和消费者服务,只能增加消费者或生产者数量,但是传输的内容无法进行分类,也无法将某条消息指定给某个消费者消费
2.3、发布订阅消息传递模式
在发布-订阅消息系统中,消息被持久化到一个topic中。与点对点消息系统不同的是,消费者可以订阅一个或多个topic,消费者可以消费该topic中所有的数据。在发布-订阅消息系统中,消息的生产者称为发布者,消费者称为订阅者。其实每个topic都可以理解为一个队列,然后可以为这个队列指定具体的消费者。
二、kafka浅析
2.1、概述
Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin公司于2010年贡献给了Apache基金会并成为顶级开源项目。
2.2、主要应用场景
主要应用于大数据实时处理领域,例如基于Hadoop的批量处理系统,低延迟的实时系统、storm/Spark流式处理引擎、web/Nginx日志、访问日志、消息服务等
2.3、特点
-
以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
-
高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
-
支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
-
同时支持离线数据处理和实时数据处理。
-
Scale out:支持在线水平扩展。
2.4、术语解析
Kafka中发布订阅的对象是topic。我们可以为每类数据创建一个topic,把向topic发布消息的客户端称作producer,从topic订阅消息的客户端称作consumer。Producers和consumers可以同时从多个topic读写数据。一个kafka集群由一个或多个broker服务器组成,它负责持久化和备份具体的kafka消息
-
broker:一台kafka服务器就是一个broker。一个集群由多个broker节点组成。一个broker可以容纳多个topic,且拥有多个分区
- 假设某topic有N个分区,集群中有M个broker。则分区与broker间的关系:
- 若N>M 且N除以M是整数,则broker会平均存储这些分区
- 若N>M 且N%M!=0, 则每个broker中的分区是不平均的(导致负载不均衡)
- 若N<M 则会有N台broker服务器中具有一个分区,另外M-N台broker中是没有分区的
- 假设某topic有N个分区,集群中有M个broker。则分区与broker间的关系: