kafka基本原理

老铁们,新年快乐,现在,就让我和你们一起讨论有关于kafka这个分布式发布-订阅消息系统(消息可以重复读取哦,不是点对点模式的使用过后就不能二次利用的啦,不知道点对点没关系,知道发布-订阅既可以了,他们都属于消息队列,..)

首先让我们了解这个系统为什么会出现呢,任何一个系统的出现都不是没有理由的

    首先  让我们思考一下,当我们有10000条数据需要进行写入,但是服务器的处理能力只有9000,怎么办??最简单的就是存起来,下次执行喽大笑,但是再往下想,这样可以吗??当第二个请求的写入10000条,处理器只能处理8000 怎么办,每次都要存起来吗?看吧,累着了吧,,,亮光乍现,如果有一个中间系统将写的数据全部存起来,当读的时侯,有多大的能力,你取多少的数据去执行,不就可以了,例如:将两次的数据都存进一个地方,这里可以认为是日志,当读取的时候,因为你只有9000,8000的处理能力,那你就只拿这些数据进行处理好了,这部剧完美解决了吗___>嘿嘿,这就是kafka,一个分布式的,可划分的,多订阅者,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。

1:老铁们别急,先让我们看下它的工作原理图:(先跟着看,下面我会解释的哦)


先让我们认识一下他们名词解释:

 Producer 特指消息的生产者(发布订阅系统,针对的肯定是生产者,消费者哦)

 Consumer 特指消息的消费者

 Consumer Group 消费者组,可以并行消费Topic中partition的消息

  Broker:缓存代理,Kafa 集群中的一台或多台服务器统称为 broker理解为一个大缓存啦,所有的数据都来找我,数据土豪啦!!!!!!!)

  Topic:特指 Kafka 处理的消息源的不同分类。(例如美食啊,旅游啊,当然这是胡扯了,可以这样了理解啦)

  Partition:Topic 物理上的分组,一个 topic 可以分为多个 partition,(这样可以提升效率,有利于多个consumer进行并行访问啊!!)每个 partition 是一个有序的队列。两个partition 就不是有序的啦,因此在处理时进的顺序的调度哦。每个partition 中的每条消息都会被分配一个有序的 id(offset)。

  Message:消息,是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息。

  Producers:消息和数据生产者,向 Kafka 的一个 topic 发布消息的过程叫做 producers。

  Consumers:消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers。


3:详细解读:

    3.1 Kafka的Producers

消息和数据生产者,向 Kafka 的一个 topic 发布消息的过程叫做 producers。
Producer将消息发布到指定的Topic中,同Producer也能决定将此消息归属于哪个partition;
异步发送

批量发送可以很有效的提高发送效率。Kafka producer的异步发送模式允许进行批量发送,先将消息缓存在内存中,然后一次请求批量发送出去。

     3.2 Kafka的Broker

Broker:缓存代理,Kafka 集群中的一台或多台服务器统称为 broker。

Message在Broker中通过Log追加的方式进行持久化存储。并进行分区(patitions)

为了减少磁盘写入的次数,broker会将消息暂时buffer起来,当消息的个数(或尺寸)达到一定阀值时,再flush到磁盘,这样减少了磁盘IO调用的次数。

            3.2.1 Kafka的Broker无状态机制

1.  Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。

2.  Broker不保存订阅者的状态,由订阅者自己保存。

3.  无状态导致消息的删除成为难题(可能删除的消息正在被订阅),kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天)后会被删除。

4.  消息订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id)进行重新读取消费消息。

    3.3 Kafka的Message组成

Message消息:是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息。

Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的。每个topic又可以分成几个不同的partition(每个topic有几个partition是在创建topic时指定的),每个partition存储一部分Message。

partition中的每条Message包含了以下三个属性:
offset    对应类型:long
MessageSize    对应类型:int32
data        是message的具体内容

Kafka的Consumers

消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers。

在 kafka中,我们 可以认为一个group是一个“订阅者”,一个Topic中的每个partions,只会被一个“订阅者”中的一个consumer消费,不过一个 consumer可以消费多个partitions中的消息(消费者数据小于Partions的数量时)

注: kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息.

3.4 Kafka的持久化

数据持久化:
发现线性的访问磁盘,很多时候比随机的内存访问快得多
传统的使用内存做为磁盘的缓存
Kafka直接将数据写入到日志文件中

日志数据持久化特性:
写操作:通过将数据追加到文件中实现
读操作:读的时候从文件中读就好了

优势:读操作不会阻塞写操作和其他操作,数据大小不对性能产生影响;
                  没有容量限制(相对于内存来说)的硬盘空间建立消息系统;
                  线性访问磁盘,速度快,可以保存任意一段时间!

一个Topic可以认为是一类消息,每个topic将被分成多partition(区),每个partition在存储层面是append log文件。任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),partition是以文件的形式存储在文件系统中。
Logs文件根据broker中的配置要求,保留一定时间后删除来释放磁盘空间。


Partition:

    Topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。       partition 中的每条消息都会被分配一个有序的 id(offset)。



3.5 为数据文件建索引:稀疏存储,每隔一定字节的数据建立一条索引。下图为一个partition的索引示意图:





4:其次:再说说它的优点吧》》

kafka的优点:

@同时为发布和订阅提供高吞吐量。据了解,Kafka 每秒可以生产约 25 万消息(50 MB),每秒处理 55 万消息(110 MB)。

@可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如 ETL,以及实时应用程序。通过将数据持久化到硬盘以及 replication 防止数据丢失。

@分布式系统,易于向外扩展。所有的 producer、broker 和 consumer 都会有多个,均为分布式的。无需停机即可扩展机器。

@消息被处理的状态是在 consumer 端维护,而不是由 server 端维护。当失败时能自动平衡。

支持 online 和 offline 的场景。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值