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):

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

原文地址:https://www.cnblogs.com/haojia/p/12386211.html