领导抛出一个问题,小张,在你的微服务中集成Kafka发点数据.
从实际入手,先进行概念的剖析,继而应用概念进行kafka的集成使用
概念篇
Kafka是什么?
Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.
Apache Kafka是一个开源的分布式事件流平台,成千上万的公司使用它来实现高性能数据管道,流分析,数据集成和关键任务应用程序。
在本任务中,我们主要使用的是kafka的消息队列功能,把kafka应用为微服务的消息中间件
kafka的模式
基于发布与订阅的消息系统,和点对点的消息系统有啥区别的
在这我们可以理解为诸多用户订阅电脑报(暴露年龄),此时的电脑报充满了消息,就是我们的消息队列
而各个编辑将文章发布到报纸上,即生产者可以是多个
而诸多订阅者都可以看,即消费者可以是多个
Topic
继续刚才的模型,我们订阅了电脑报,就可以接收电脑报的消息,那此时我又想订阅读者,青年文摘,意林呢,映射到公司系统中,如果没有统一管理的中间件,那么会出现水平扩展发布者的情况,每当需要一类新的信息,就需要新开发一个发布者模块,最终导致系统熵值迅速扩大
所以Kafka引入了Topic(主题),多个主题统一由kafka管理,电脑报消息发送到电脑报topic,消费者去电脑报topic消费,同时青年文摘消息发送到青年文摘topic,消费者去青年文摘topic消费,避免公司需要为消息队列维护多个系统,有了kafka,我们就拥有了一个单一的集中式系统
分区
一个主题可以分为多个分区,可以理解为mysql分库的概念,在理想情况下,并且没有特殊的设置,消息会均匀的发往各个分区
关于顺序:由于主题内有多个分区,因此无法在整个主题内保证消息的顺序,但可以保证消息在单个分区内的顺序,即单个分区有序
消息
刚才我们也提到了发送消息,kafka的数据单元被称为消息,可以简单的理解为传统关系型数据库中的一行数据 那mysql有表结构,我kafka咋发呢?
模式
用模式(schema),结合apache avro,提供了一种紧凑的序列化格式,我们拿一个简单的avro schema来看一下
{
"fields": [
{ "name": "name", "type": [
"null",
"string"
],
"default": null },
{ "name": "company", "type": [
"null",
"string"
],
"default": null }
],
"name": "test",
"type": "record"
}
这个名为test的schema拥有两个字段,分别是name与company,字段类型均为复合类型,即可以为null,或String,发送消息是按schema发送,接受消息时用它解析
生产者和消费者
生产者创建消息,消费者读取消息
澄清以上概念后,在Part2中我们将寻找概念与代码的映射,进而快速上手kafka的开发