【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框架

    • 它是一个发布和拉取过程
      • 服务端不会主动把数据推送给消费者,需要消费者自己主动把数据拉取过来

    【kafka】kafka介绍 kafka和消息队列的区别 & kafka的系统架构

  • 架构模型方面

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的某分片上。

消息队列的作用

消息系统的核心作用就是三点:解耦,异步和并行
以用户注册的案列来说明消息系统的作用
用户注册的一般流程
【kafka】kafka介绍 kafka和消息队列的区别 & kafka的系统架构

问题:随着后端流程越来越多,每步流程都需要额外的耗费很多时间,从而会导致用户更长的等待延迟。

用户注册的并行执行

【kafka】kafka介绍 kafka和消息队列的区别 & kafka的系统架构
问题:系统并行的发起了4个请求,4个请求中,如果某一个环节执行1分钟,其他环节再快,用户也需要等待1分钟。如果其中一个环节异常之后,整个服务挂掉了。
【kafka】kafka介绍 kafka和消息队列的区别 & kafka的系统架构

用户注册的最终一致
【kafka】kafka介绍 kafka和消息队列的区别 & kafka的系统架构

  1. 保证主流程的正常执行、执行成功之后,发送MQ消息出去。
  2. 需要这个destination的其他系统通过消费数据再执行,最终一致。

【kafka】kafka介绍 kafka和消息队列的区别 & kafka的系统架构

kafka的架构模型

基于producer consumer topic broker 等的一个基本架构

【kafka】kafka介绍 kafka和消息队列的区别 & kafka的系统架构

  1. producer
    - 生产者,它会把数据源写入到kafka集群中
  2. broker
    - 一个broker就是kafka集群的节点,可以存放数据
  3. topic
    - 消息的主题,它是一类消息的集合
  4. partition
    - 分区概念
    - 也就是说一个topic有多个分区
  5. replication
    - 副本
    - 一个分区可以设置多个副本,副本保证数据的安全性
  6. segment
    - 每一个分区数据都很多segment,一个segment里面有2个文件,一个是.log文件,它是topic数据存储的文件,还有一个文件叫.index文件,它是.log文件索引文件。
  7. zookeeper
    - 通过zk保存kafka集群元数据信息,这些元数据信息包括:kafka集群地址、有哪些topic,以及每一个topic的分区数等等信息
  8. consumer
    - 消费者
    - 消费者去kafka集群中拉取数据然后进行消费
  9. offset
    - 消息的偏移量
    - 保存消息消费到哪里了,它会把消息消费的数据记录,当前这个记录信息叫做offset偏移量
    - 消息偏移量的保存有2种方式
    - 第一种: 可以kafka自己去保存(这个偏移量由整个kafka集群自带一个topic:__consumer_offsets)
    - 第二种:由zookeeper保存
    【kafka】kafka介绍 kafka和消息队列的区别 & kafka的系统架构