zoukankan      html  css  js  c++  java
  • kafka和消息队列

    一、消息队列的介绍

      消息:网络间传递的数据

      消息队列:(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,

      

    二、常用的消息队列介绍

      1)RabbitMQ

        是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。

      2)ActiveMQ

        ActiveMQ是由Apache出品,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能

      3)RocketMQ

        阿里出品,参考kafka做出的改进,消息可靠性比kafka好。

      4)kafka

       Apache Kafka是一个分布式消息发布订阅系统,Kafka系统快速、可扩展并且可持久化,它的分区特性,可复制和可容错都是其不错的特性

    5)消息队列的对比

    三、消息队列的应用场景

      1)应用耦合

        将多个应用之间进行解耦合

      2)异步处理

        多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;

      3)限流削峰

        广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;先把流量放入消息队列中,然后再去消费

      4)消息驱动的系统

        系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理;

    四、消息队列的两种模式

      1)点对点模式(一个生产者和一个消费者)

        

    消息发送者生产消息发送到queue中,然后消息接收者从queue中取出并且消费消息。消息被消费以后,queue中不再有存储,所以消息接收者不可能消费到已经被消费的消息。

    点对点模式特点:
    •	每个消息只有一个接收者(Consumer)(即一旦被消费,消息就不再在消息队列中);
    •	送者和接发收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息;
    •	接收者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息;
    

      2)发布-订阅模式(生产者和多个消费者)

        

    发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

    发布/订阅模式特点:
    •	每个消息可以有多个订阅者;
    •	发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
    •	为了消费消息,订阅者需要提前订阅该角色主题,并保持在线运行;
    

    五、kafka的基本介绍

      kafka:一个消息队列,afka是一个分布式,分区的,多副本的,多订阅者的日志系统(分布式MQ系统),使用scala编写。

      kafka是顺序读写。

    流式处理:flume + kafka + sparksteaming(flink)

    六、kafka的架构介绍

      

      1)生产者API

        允许应用程序发布记录流至一个或者多个kafka的主题(topics)。

      2)消费者API

        首先订阅主题,基于主题来消费数据

      3)SteamsAPI

        流处理针对的主题中的数据,按照流的方式进行处理

      4)ConnectAPI

        应用连接的API

    七、kafka架构内部细节剖析

    说明:kafka支持消息持久化,消费端为拉模型来拉取数据,消费状态和订阅关系有客户端负责维护,消息消费完 后,不会立即删除,会保留历史消息。因此支持多订阅时,消息只会存储一份就可以了。
    
    -- Broker:kafka集群中包含一个或者多个服务实例,这种服务实例被称为Broker
    -- Topic:每条发布到kafka集群的消息都有一个类别,这个类别就叫做Topic 
    -- Partition:Partition是一个物理上的概念,每个Topic包含一个或者多个Partition 
    -- segment:一个partition当中存在多个segment文件段,每个segment分为两部分,.log文件和.index文件,其中.index文件是索引文件,主要用于快速查询.log文件当中数据的偏移量位置
    -- Producer:负责发布消息到kafka的Broker中。
    -- Consumer:消息消费者,向kafka的broker中读取消息的客户端
    -- Consumer Group:每一个Consumer属于一个特定的Consumer Group(可以为每个Consumer指定 groupName)
        .log:存放数据文件
        .index:存放.log文件的索引数据 稀疏存储
    

    八、kafka主要组件说明

      1)producer

        producer主要用于生产消息,是kafka当中的消息生产者,生产的消息通过topic分类,保存到kafka的broker里面去

      2)topic

        kafka将消息以topic为单位进行分类

        topic特指kafka处理的消息源的不同分类

        kafka主题始终是支持多用户订阅的 ,在kafka集群中,可以有无数的主题,生产者和消费者数据一般以主题为单位

    3)partition

        一个topic可以有多个分区,每个分区保存部分的topic数据,所有分区当中的数据合并起来就是一个topic当中所有的数据

        每一个分区的数据是有序的

        partition数量决定了每个Consumer group中并发消费者的最大数量

    4)segment

        一个partition单重由多个segment文件组成,每个segment文件,包含两部分,一个是.log文件。另外一个是.index文件,

        .log文件包含了我们发送的数据存储

        .index文件,记录的是我们.log文件的数据索引值,以便我们加快数据的查询速度

    5)kafka分区与消费组的关系

      消费组:由一个或者多个消费者组成,同一个组中的消费者对于同一条消息只消费一次。

      某一个主题下的分区数,对于消费组来说,应该小于等于主题下的分区数

      同一个分区下的数据,在同一个时刻,不能同一个消费组的不同消费者消费

      总结:分区数越多,同一时间可以有越多的消费者来进行消费,消费数据的速度就会越快,提高消费的性能

    6)consumer

        kafka中的消费者,任何时刻,一个分区当中的数据,只能被kafka当中同一个消费组下面的一个县城消费

    九、kafka的log存储以及查询机制

      kafka中log日志目录及组成

       kafka在我们指定的log.dir目录下,会创建一些文件夹,名字是 主题名+分区名,在此目录下,会有两个文件夹存在,.log和.index文件

       这个文件,会根据log日志的大小进行切分,.log文件的大小为1G的时候,就会进行切分文件

    十、数据不丢失机制

      1、从生产者的角度来考虑

        同步:发送一批数据给kafka,等待kafka返回结果

    1、生产者等待10s,如果broker没有给出ack相应,就认为失败。
    2、生产者重试3次,如果还没有响应,就报错
    

        异步:发送一批数据给kafka,只是提供一个回调函数。

    1、先将数据保存在生产者端的buffer中。buffer大小是2万条 
    2、满足数据阈值或者数量阈值其中的一个条件就可以发送数据。
    3、发送一批数据的大小是500条
    
    说明:如果broker迟迟不给ack,而buffer又满了,开发者可以设置是否直接清空buffer中的数据。

      ack确认机制

    生产者数据发送出去,需要服务端返回一个确认码,即ack响应码;ack的响应有三个状态值

    0:生产者只负责发送数据,不关心数据是否丢失,响应的状态码为0(丢失的数据,需要再次发送      )
    1:partition的leader收到数据,响应的状态码为1
    -1:所有的从节点都收到数据,响应的状态码为-1

      2、kafka的broker中数据不丢失

    在broker中,保证数据不丢失主要是通过副本因子(冗余),防止数据丢失

      3、消费者消费数据不丢失

    在消费者消费数据的时候,只要每个消费者记录好offset值即可,就能保证数据不丢失。

    十一、CAP理论以及kafka当中的CAP机制(三个指标最多满足两个)

      一致性(Consisitency):数据的一致性.

        强一致性:分布式系统是有节点可以立即感知数据的变化并更新。

        弱一致性:数据有所改变,其他节点很长时间更新甚至不更新。

        完全一致性:经过一定时间,最终完成数据的一致

      可用性(Availability):

        任何一个没有发生故障的节点必须在有限的时间内返回合理的结果

      分区容错性(Partition tolerance):

        部分节点宕机或者无法与其它节点通信时,各分区间还可保持分布式系统的功能

  • 相关阅读:
    Fragment使用具体解释
    2014百度之星第一题Energy Conversion
    HDU 2602 Bone Collector 0/1背包
    Angular 2 + 折腾记 :(7) 初步了解表单:模板驱动及数据驱动及脱坑要点
    《开源框架那点事儿25》:对框架模板引擎实现方式的改造实录
    ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
    sql改写or 改成union不等价数据变多
    在GDAL中添加GDALRasterizeGeometriesBuf函数
    多时相地图瓦片简单设想
    记录一次使用VS2015编译错误的原因查找(boost+gdal)
  • 原文地址:https://www.cnblogs.com/haojia/p/12386211.html
Copyright © 2011-2022 走看看