消息队列(二):Kafka

  • kafka是一个分布式的发布订阅(Pub/Sub)消息队列。具有高性能、持久化、多副本备份、横向扩展能力。生产者往队列里写消息,消费者从队列里取消息进行业务逻辑。一般在架构设计中起到解耦、削峰、异步处理的作用。它主要用于日志统计分析、处理活跃的数据(登录、浏览、点击、分享、喜欢等用户行为产生的数据)。

三大特点:

  • 1、高吞吐量:可以满足每秒百万级别消息的生产和消费——生产消费。QPS
  • 2、持久性:有一套完善的消息存储机制,确保数据的高效安全的持久化——中间存储。
  • 3、分布式:基于分布式的扩展和容错机制;Kafka的数据都会复制到几台服务器上。当某一台故障失效时,生产者和消费者转而使用其它的机器——整体健壮性。

Kafka组件:
对于kafka而言,kafka服务就像是一个大的水池。不断的生产、存储、消费着各种类别的消息。那么kafka由何组成呢?

  • 1、 Kafka服务:
    Topic:主题,Kafka处理的消息的不同分类。
    Broker:消息代理,Kafka集群中的一个kafka服务节点称为一个broker,主要存储消息数据。存在硬盘中。每个topic都是有分区的。
    Partition:Topic物理上的分组,一个topic在broker中被分为1个或者多个partition,分区在创建topic的时候指定。
    Message:消息,是通信的基本单位,每个消息都属于一个partition
  • 2、Kafka服务相关
    Producer:消息和数据的生产者,向Kafka的一个topic发布消息。
    Consumer:消息和数据的消费者,定于topic并处理其发布的消息。
    Zookeeper:协调kafka的正常运行。
    消息队列(二):Kafka_第1张图片

kafka对外使用topic的概念,生产者往topic里写消息,消费者从读消息。为了做到水平扩展,一个topic实际是由多个partition组成的,遇到瓶颈时,可以通过增加partition的数量来进行横向扩容。单个parition内是保证消息有序。Topic相当于传统消息系统MQ中的一个队列queue,producer端发送的message必须指定是发送到哪个topic,但是不需要指定topic下的哪个partition,因为kafka会把收到的message进行load balance,均匀的分布在这个topic下的不同的partition上。在消费时,一个partition,只能被同一个消费组里的一个消费者(同一组的两个或两个以上消费者不可以)消费,但是可以同时被多个消费组消费。如果Consumer的个数多于Partition的个数,那么会有部分Consumer无法消费该Topic的任何数据,也即当Consumer个数超过Partition后,增加Consumer并不能增加并行度。简而言之,Partition个数决定了可能的最大并行度。
每个partition在存储层面是append.log文件。新消息都会被直接追加到log文件的尾部,每条消息在log文件中的位置称为offset(偏移量)。
总之:业务区分增加topic、数据量大增加partition。

kafka支持3种消息投递语义
At most once:最多一次,消息可能会丢失,但不会重复
At least once:最少一次,消息不会丢失,可能会重复
Exactly once:只且一次,消息不丢失不重复,只且消费一次(0.11中实现,仅限于下游也是kafka)
在业务中,常常都是使用At least once的模型,如果需要可重入的话,往往是业务自己实现。

关于zookeeper:

  1. Producer端使用zookeeper用来"发现"broker列表,以及和Topic下每个partition leader建立socket连接并发送消息.
  2. Broker端使用zookeeper用来注册broker信息,已经监测partition leader存活性.
  3. Consumer端使用zookeeper用来注册consumer信息,其中包括consumer消费的partition列表等,同时也用来发现broker列表,并和partition leader建立socket连接,并获取消息。
    消息队列(二):Kafka_第2张图片

Kakfa Broker Leader的选举:Kakfa Broker集群受Zookeeper管理。所有的Kafka Broker节点一起去Zookeeper上注册一个临时节点,因为只有一个Kafka Broker会注册成功,其他的都会失败,所以这个成功注册临时节点的Kafka Broker会成为Controller,其他的Kafka broker叫follower。

你可能感兴趣的:(java后台技术)