1、Kafka三种特性
1) 可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。
2) 可以储存流式的记录,并且有较好的容错性。
3) 可以在流式记录产生时就进行处理。
2、Kafka API及功能:
1) The Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
2) The Consumer API 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。
3) The Streams API 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
4) The Connector API 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。
3、Kafka默认规则
1) 每个主题可以有多个分区(均衡压力)
2) 每个主题可以由多个消费组来分别消费(入ES和入DB等)
3) 每个消费组可以由多个消费者组成
4) 每个主题的单个分区仅能被同一消费组的一个消费者消费(保证同一分区消息的顺序性)
5) 同一个主题同一个消费组,消费者总数不超过分区数,否者多余消费者会闲置
6) 生产者可批量发送消息
7) 生产者可通过异步回调验证消息是否写入kafka
8) 生产者发送消息不指定分区,kafka默认顺序轮询均衡分配到每个分区
9) 消费者可批量消费消息
10) 消费者可通过提交偏移量方式确认消息消费成功
4、Kafka具体方案设计
Kafka消息传送需要对key和value的序列化,以流进行传递,为了兼容多平台,万物皆字符串思想,对key和value皆采用org.apache.kafka.common.serialization.StringSerializer序列化,消费者接受到消息后kafka自动将其转换成字符串方便后续业务进行处理。
为了提升kafka的吞吐量,利用CPU换内存及IO的思想,对消息体进行压缩,采用gzip压缩方式,kafka架包会自动对消息进行压缩和解压。
注:当然要视实际情况而定,可以通过测试取舍是否压缩。
1) 生产者与消费者示意图
注:消费者可以开启多线程对批量消息进行分片处理增加消息处理能力。(但多线程需要通过CountDownLatch来等待所有线程执行完再提交偏移量,防止出现异常导致某些消息未消费的情况发生)。
2) 消费者与分区示意图
3) 性能保证
定抄数据发布至同一个主题中,每个主题8个分区(此处可以配置,视情况调优此参数),使用同一个消费组,此消费组有8个消费者,kafka自动重平衡达到每个消费者消费一个分区的消息,每个消费者采用批量读取500条消息(此值可配置),每个消费者采用多线程数据分片技术,提升单消费者的吞吐量。