KafKa-分布式消息队列

背景

不同的服务器为了平衡不能的处理能力,降低耦合,平衡两者的处理能力的不同,分布式消息队列就出现了

kafka 的设计动机

  • 数据的生产者和消费者的耦合度过高
  • 生产者和消费者的数据处理速率不同
  • 大量的并发的网络连接对后端消费不太友好

kafka可应用的领域

  • 消息中间件
  • 消息队列(不同于activemq 等单机消息队列)
  • 发布订阅系统
  • 消息总线

kafka 的特点

kafka是在大数据的背景下产生的,能应对海量的数据

  • 高性能
    (单机相同配置的情况下 kafka 比 rabbitmq 的性能高40-50倍)
  • 良好的扩展性
    因为kafka 是分布式的,相比较单节点的就会有可扩展和容错的特点
  • 数据的持久性
    数据消息会持久化到磁盘上

kafka的基本架构

  • kafka 架构是由producer、broker、consumer 三个组件构成
  • producer将数据写入broker,consumer将数据从broker中读出来
  • broker构成了连接producer和consumer的缓冲区
  • broker和consumer是通过zookeeper来作为协调的(kafka从0.9.0版本开始后,consumer不再依赖于zk)
  • 多个broker构成了一系列的数据存储系统,可以防止数据丢失
  • broker中的消息被分为多个topic
  • 同属于一个topic的消息被分为多个partition
  • kafka 不同于其他消息的push-push架构,而是push-pull架构
  • producer将数据push给broker,而broker上的数据是 consumer通过pull从broker上获取的
    这样设计的优势是:
    1、consumer 可以根据自己的需要从broker上获取,避免push形成的压力过大
    2、consumer可以自己读取消息,并记录自己的消息offset,大大降低了broker的压力

kafka各组件详解

kafka producer

在kafka中每条消息包含

  • topic
    划分消息的概念
  • key
    消息的主键,kafka会根据主键,将同一topic下的消息划分为不同的partition(默认时采用hash取模
    ),patition的数量是创建topic的时候静态制定的
  • messege
    消息的实体,可以是字符串,也可以是json ,avro,thrift等
kafka broker
  • 在kafka中一般会有多个broker,多个broker构成一个分布式的高容错集群
  • 将数据持久化到磁盘上
  • broker将topic分成好几个分区(partition),每个分区会有多个副本,这些partation只有一个leader,其他都是follower,只有leader对外服务,follower不对外服务,只保证和leader的数据一致,当leader宕机后,就会选举其他的leader
  • broker可以将同一partiton内部的消息是有序的,但无法保证全局的partition消息有序
  • broker会给每个partition一个offset(偏移量),offset由各自的consumer来维护,每次取消息告诉broker消息的offset
  • broker的消息在磁盘中的默认保存时7天,时间一到就会清除数据来释放磁盘
kafka consumer
  • consumer 自己保存offset,并向broker拉数据(不同于activemq,rabbitmq),
  • kafka允许consumer构成一个consumer group来提高效率
kafka zookeeper
  • broker与zookeeper
    broker将topic ,partition 等信息写入zookeeper ,zk来监控健康状态
  • consumer 与zookeeper
    consumer group通过zk 来保证每个consumer的负载均衡

kafka 关键技术点

可控的可靠性级别
  • producer向broker中写数据时,分为同步和异步,异步一般都可提高效率
  • 当producer向broker传输消息时,可靠性应答可通过参数 request.required.acks = ?来设定
    参数为0 时,当producer向broker 写数据时,无序确认就返回
    参数为1时,当producer向broker写数据时,当只要partition的leader写入成功后就放回
    参数为-1时,当producer向broker写数据时,所有patition的所有副本都写入成功就放回
数据的多副本
  • kafka 的broker的patition的复制先复制到leader上,然后在依次复制,当leader所在服务器出现异常时,选举机制就会选举别的follower为leader
kafka高效的持久化机制
  • kafka是直接将数据持久化磁盘而不是内存,这要求有高效的读写速度,实际上,数据写入磁盘时,顺序读写的速度远远高效于随机(写入快,寻址慢)
数据传输优化
可控的消息传递语义

在消息系统中,根据接收者可能受到重复消息的次数,将消息传递语义分为三种

  • at most once:发送者将消息发送之后 立刻返回,并不关心接收者是否接收
  • at least once:发送者将消息发送后,等待确认,如果没有受到确认,则重复发送
  • at exactly once:消费者只会处理消费一次(两端锁协议和支持幂等协议)

你可能感兴趣的:(KafKa-分布式消息队列)