kafka

一、什么是kafaka
高吞吐量的分布式消息队列,使用Zookeeper进行集群的管理。
kafka 不能脱离 zookeeper 单独使用,因为 kafka 使用 zookeeper 管理和协调 kafka 的节点服务器。
kafka对消息保存时根据topic进行归类,发送消息者称为Producer,消息接收者称为Consumer
二消息队列的内部实现原理
1.消息队列的模式
1)点对点模式
一对一,消费者主动拉取数据,消息收到后消息清楚
在这里插入图片描述
优点:客户端自己控制获取速度
缺点:需要线程试试监控
特点:发送到队列的消息被一个且只有一个接收者接收处理,即使有多个监听者也是如此
在这里插入图片描述

2)发布/订阅模式
一对多,数据生产后,推送给所有订阅者在这里插入图片描述
优点:不用专门检测不需要主动拉取
缺点:但是推送速度只能统一控制
特点:临时订阅者旨在主动监听时才能接收消息,而持久订阅者则监听主题的所有消息即使当前订阅者不可用处于离线状态
发布/订阅模式下消费消息又有两种方式:(原文链接:https://blog.csdn.net/xiaolyuh123/article/details/108830498)


  • 推模式,这种方式由queue直接将消息推给消费者,由于各消费者处理消息的能力不一样,所以这种方式某些消费者可能消费不过来推过来的消息。
    在这里插入图片描述
  • 拉模式,这种方式是由消费者去拉取queue中的消息,这种方式下消费者可以根据自己的消费能力来拉取数据,但是每个消费者需要维护一个拉取消息的任务,及时队列里面没有消息,这个任务也不能停下来。
    在这里插入图片描述
    2.为什么需要消息队列
    1)解耦
    2)冗余(队列可以备份数据,把数据进行持久化直到它们已经被完全处理完毕)
    3)扩展性(集群)
    4)灵活性和峰值处理能力(集群)
    5)可恢复性(因为冗余有备份)
    6)顺序保证(队列先进先出)
    7)缓冲
    8)异步通信
    三、kafka
    1.术语
    1)Broker
    Kafka 集群包含一个或多个服务器,服务器节点称为broker。
    broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
    如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
    如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。
    2)Topic
    每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)
    类似于数据库的表名
    3)Partition(分区):做负载均衡
    topic中的数据分割为一个或多个partition。每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,不同partition间的数据丢失了数据的顺序。如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。
    Partition(分区),是Kafka下数据存储的基本单元,这个是物理上的概念。一个 topic 可以分为多个 partition,每个 partition 都是一个有序的队列,同一个分区(partition)可以被不同的消费者组同时消费,但是同一个消费者组内只能被一个消费者消费,通过提升分区数量可以提升同一个Topic的吞吐量
    分区的原则:
    (1)指定了partition,则直接使用
    (2)未指定partition但指定key,通过对key的value进行hash出一个partition
    (3)partition和key都未指定,使用轮询选出一个partition
    4)Leader
    每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。
    5)Follower
    是其Leader的数据备份,与其Leader在不同分区
    Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。
    6)Producer
    生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。
    7)Consumer
    消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。
    8)Consumer Group
    每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。
    在这里插入图片描述
    2.Producer写入流程
    在这里插入图片描述
    在这里插入图片描述
    ack机制:
    ack的值0,1,all
    当producer向leader发送数据时,可以通过request.required.acks参数来设置数据可靠性的级别:
  • 0:这意味着producer无需等待来自broker的确认而继续发送下一批消息。这种情况下数据传输效率最高,
    但是数据可靠性确是最低的。
  • 1(默认):这意味着producer在ISR中的leader已成功收到的数据并得到确认后发送下一条message。
    如果leader宕机了,则会丢失数据。
  • -1(或者是all):producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。
    但是这样也不能保证数据不丢失,比如当ISR中只有leader时(ISR中的成员由于某些情况会增加也会减少,最少就只剩一个leader),这样就变成了acks=1的情况。

    ISR (In-Sync Replicas),这个是指副本同步队列。副本数对Kafka的吞吐率是有一定的影响,但极大的增强了可用性。默认情况下Kafka的replica数量为1,即每个partition都有一个唯一的leader,为了确保消息的可靠性,通常应用中将其值(由broker的参数offsets.topic.replication.factor指定)大小设置为大于1,比如3。 所有的副本(replicas)统称为Assigned Replicas,即AR。ISR是AR中的一个子集,每个Partition都会有一个ISR,而且是由leader动态维护,follower从leader同步数据有一些延迟(包括延迟时间replica.lag.time.max.ms和延迟条数replica.lag.max.messages两个维度。

    3.kafka的模式
    不同消费者组之间是基于发布/订阅的拉模式来实现的;同一消费者组里面的消费者,消费消息使用的是点对点模式,只是这里消费完消息后不会删除消息。

    4.kafka 有两种数据保存策略:(https://zhuanlan.zhihu.com/p/62099094)
    按照过期时间保留和按照存储的消息大小保留。
    如果同时设置了两个策略,那么时间和大小不论那个满足条件,都会执行数据清除工作,清空数据。
    zookeeper存储结构
    在这里插入图片描述
    5.什么情况会导致 kafka 运行变慢?
  • cpu 性能瓶颈
  • 磁盘读写瓶颈
  • 网络瓶颈
    6.使用 kafka 集群需要注意什么?
    集群的数量不是越多越好,最好不要超过 7 个,因为节点越多,消息复制需要的时间就越长,整个群组的吞吐量就越低。
    集群数量最好是单数,因为超过一半故障集群就不能用了,设置为单数容错率更高。
    7.kafka命令行操作
    在这里插入图片描述
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值