美文网首页
KafKa-分布式消息队列

KafKa-分布式消息队列

作者: 一个喜欢烧砖的人 | 来源:发表于2018-09-15 17:01 被阅读24次

    背景

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

    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-分布式消息队列

          本文链接:https://www.haomeiwen.com/subject/tfftnftx.html