【kafka】kafka介绍 kafka和消息队列的区别 & kafka的系统架构
Kafka介绍
Kafka最初是由LinkedIn开发,并于2011年初开源。2012年10月从Apache Incubator毕业。该项目的目标是为处理实时数据提供一个统一、高吞吐量、低延迟
的平台。
Kafka是一个分布式消息队列:生产者、消费者的功能。 它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。
Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。
无论是kafka集群,还是producer和consumer都依赖于zookeeper
集群保存一些meta信息,来保证系统可用性
kafka与ActiveMQ区别
-
activeMQ是一个标准的JMS(java message)java消息队列实现
- 它是一个
发布和订阅
过程- 服务端
主动
把数据推送给消费者
- 服务端
- 它是一个
-
kafka不是一个标准的JMS(java message)java消息队列实现,它是一个类似于JMS框架
- 它是一个
发布和拉取
过程- 服务端不会主动把数据推送给消费者,
需要消费者自己主动把数据拉取过来
- 服务端不会主动把数据推送给消费者,
- 它是一个
-
在架构模型方面
RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。rabbitMQ以broker为中心;有消息的确认机制。
kafka遵从一般的MQ结构,producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据;无消息确认机制。
- 在吞吐量
kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。
rabbitMQ在吞吐量方面稍逊于kafka,他们的出发点不一样,rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。
- 在可用性方面
rabbitMQ支持miror的queue,主queue失效,miror queue接管。kafka的broker支持主备模式。
- 在集群负载均衡方面
kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。
消息队列的作用
消息系统的核心作用就是三点:解耦,异步和并行
以用户注册的案列来说明消息系统的作用
用户注册的一般流程
问题:随着后端流程越来越多,每步流程都需要额外的耗费很多时间,从而会导致用户更长的等待延迟。
用户注册的并行执行
问题:系统并行的发起了4个请求,4个请求中,如果某一个环节执行1分钟,其他环节再快,用户也需要等待1分钟。如果其中一个环节异常之后,整个服务挂掉了。
用户注册的最终一致
- 保证主流程的正常执行、执行成功之后,发送MQ消息出去。
- 需要这个destination的其他系统通过消费数据再执行,最终一致。
kafka的架构模型
基于producer consumer topic broker 等的一个基本架构
- producer
- 生产者,它会把数据源写入到kafka集群中 - broker
- 一个broker就是kafka集群的节点,可以存放数据 - topic
- 消息的主题,它是一类消息的集合 - partition
- 分区概念
- 也就是说一个topic有多个分区 - replication
- 副本
- 一个分区可以设置多个副本,副本保证数据的安全性 - segment
- 每一个分区数据都很多segment,一个segment里面有2个文件,一个是.log文件,它是topic数据存储的文件,还有一个文件叫.index文件,它是.log文件索引文件。 - zookeeper
- 通过zk保存kafka集群元数据信息,这些元数据信息包括:kafka集群地址、有哪些topic,以及每一个topic的分区数等等信息 - consumer
- 消费者
- 消费者去kafka集群中拉取数据然后进行消费 - offset
- 消息的偏移量
- 保存消息消费到哪里了,它会把消息消费的数据记录,当前这个记录信息叫做offset偏移量
- 消息偏移量的保存有2种方式
- 第一种: 可以kafka自己去保存(这个偏移量由整个kafka集群自带一个topic:__consumer_offsets)
- 第二种:由zookeeper保存