首页 > 其他 > 详细

消息队列篇

时间:2020-03-09 23:56:45      阅读:106      评论:0      收藏:0      [点我收藏+]
  1. 消息队列有了解过么?

    答:Kafka是一个消息队列,可以实现发布订阅模式,在异步通信或者生产者和消费者之间需要解耦的场景经常使用,可以对数据流进行处理等。

  2. Kafka为什么这么快?

    1. 顺序读写磁盘:消息在磁盘中的方式是顺序读写的,磁盘的顺序读写速度超过内存的随机读写
    2. 页缓存:页缓存是操作系统实现的一种主要的磁盘缓存,一次用来减少对磁盘I/O的操作。
    3. 零拷贝:零拷贝是指数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手,零拷贝大大提升了应用程序的性能,减少了内核和用户模式之间的上下文切换。
  3. Kafka的特性?

    • 支持批量读写消息
    • 支持消息的快速持久化
    • 支持消息分区,并且支持在线增加分区,提高了并发能力
    • 支持为每个分区创建多个副本
  4. Kafka中的核心概念?

    • 生产者(Producer):生产消息,并且按照一定的规则(分区分配规则)推送到Topic分区中
    • 消费者(Consumer):从Topic中拉去消息并进行消费,消费者自行维护消费消息的位置(offset)
    • 主题(Topic):存储消息的逻辑概念,是一个消息集合,Kafka根据topic对消息进行归类,发布到Kafka集群的每个消息都需要指定一个topic
    • 分区(Partition):每个Topic可以划分为多个分区,每个消息在分区中都会有唯一编号的offset,Kafka通过offset保证消息在分区中的顺序,同一Topic的不同分区可以分配在不同的Broker上。
    • 副本(replica):Kafka对消息进行冗余备份,每个分区有多个副本,每个副本中包含的消息是一样的,每个副本都会选举出一个Leader副本,其余为Follower副本,Follower副本仅仅是将数据从Leader副本拉到本地,然后同步到自己的Log中。
    • 消费者组(Consumer Group):每个Consumer都属于一个Consumer Group,每个消息只能被consumer group中的一个Consumer消费,但可以被多个consumer group消费。
    • Broker:一个单独的Server就是一个Broker,主要用来接收生产者发送过来的消息,分配offset,并且保存到磁盘中。
    • Cluster&Controller
  5. 简单介绍下Kafka的副本机制?

    在分布式的存储中,进行冗余备份是一种常见的设计,主要的设计方案有同步复制和异步复制。

    • 同步复制:当所有的follower副本都将消息复制完成,这条消息才会被认为是提交完成,一旦有一个follower副本出现故障,就会导致消息无法提交,极大地影响了系统的性能。

    • 异步复制:当Leader副本接收到生产者发送的消息后就认为当前消息提交成功,follower副本异步的从Leader副本同步消息,但是不可以保证同步速度,当leader副本突然宕机的时候,可能follower副本的消息落后太多,导致消息的丢失。

    kafka引入了ISR集合:ISR集合表示“当前”,“可用”且消息量与Leader相差不多的副本集合,需要满足如下条件:

    • 副本所有节点必须维持着与Zookeeper的链接
    • 副本最后一条信息的offset与Leader副本的最有一条消息的offset之间的差值不能超过指定的阈值。

    优点:

    • 同步复制会导致高延迟,异步复制可能会造成消息的丢失;
    • Kakfa引入的ISR集合解决了同步复制和异步复制的缺点
    • 当Follower副本延迟过高时,会被踢出ISR集合,避免了高延迟的Follower副本影响整个kafka集群的性能
    • 当Leader副本所在的Broker宕机,会优先将ISR集合中的Follower副本选举为Leader。
  6. Kafka消息传输的三大语义:

    • At most once:最多一次,消息可能会丢失,但是绝对不会重复传输。
    • At least once:最少一次,消息绝不会丢失,但有可能会重复
    • Exactly once:恰好一次,每条消息可宁会被传输一次而且仅传输一次。
  7. Kafka中关于可靠性的配置:

    答:kafka中有一些关于可靠性配置的参数,

    request.required.acks:当producer向leadrt发送数据时,可以通过request.required.acks参数来设置数据可靠性的级别:

    • 1(默认):这意味着producer在ISR的leader已成功收到数据并得到确认,如果Leader宕机,则会丢失数据
    • 0:这意味着producer无需等待来自broker的确认而继续发送下一批消息。这种情况下数据传输效率最高,但数据可靠性是最低的
    • -1:producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。但是这样也不能保证数据不丢失。比如当ISR中只有leader时,(ISR的成员由于某些情况会增加也会减少,最后就剩下一个leader),这样就变成ack=1的情况。

消息队列篇

原文:https://www.cnblogs.com/shine-rainbow/p/12452284.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!