读书笔记——Kafka核心技术与实战(Kafka入门)

  • 一.消息引擎系统ABC

    • 一款消息引擎系统,传说中的消息中间件/MQ
    • 传输的对象是消息;如何进行消息的传输是消息引擎设计机制的一部分
    • 传输协议:
      • 点对点;
      • 发布订阅;
    • 消息从A到B之间之所以需要一个消息引擎——“削峰填谷”
    • 秒杀系统:将瞬间增加的订单流量以消息形式保存在对应的主题中,一不影响上游的TPS,二给予下游较多的时间消费消息;
  • 二. 一篇文章让你快速掌握Kafka术语

    • Kafka属于分布式消息引擎系统,用以提供一套完备的消息发布和订阅解决方案。
    • 主要术语:
      • 消息:Record,Kafka处理的主要对象;
      • 主题:Topic,承载消息的逻辑容器,用以区分具体业务;
      • 分区:Partition,有序不变的消息序列,一个主题下多个分区;
      • 消息位移:Offset,分区中每条消息的位置信息,单调递增;
      • 副本:Replica,同一消息有同一个分区的多个地方的数据冗余副本实现高可用,分为领导者副本和追随者副本;
      • 生产者:Producer,向主题发布新消息的应用程序;
      • 消费者:Consumer,从主题订阅新消息的应用程序;
      • 消费者位移:Consumer Offset,消费者消费进度,每个消费者都有自己的位移;
      • 消费者组:Consumer Group,多个消费者实例组成的一个组,用以消费多个分区来实现高吞吐;
      • 重平衡:Rebalance,消费组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程,是实现高可用的重要手段;
    • 一些疑难点:
      • 什么是Kafka中的客户端和服务器端?
        • 客户端:向主题发布消息的客户端应用程序以及订阅主题消息的应用程序
        • 服务器端:一个Kafka集群由多个Broker的服务进程组成,Broker负责接收并处理客户端的请求并对消息进行持久化操作;
      • 为什么不同的Broker分散在不同机器上?
        • 若一台集群中的机器宕机,则在此之上的所有Broker进程都挂掉,其他机器的其他Broker进程也能提供服务,这是Kafka实现高可用的手段之一。
      • 既然你提到高可用,那实现高可用还有哪些手段?
        • 备份机制 Replication,把相同的数据拷贝到多台机器上,这些相同的数据拷贝称为副本,分为领导者副本——对外提供服务,与客户端交互;和追随者副本——被动地追随领导者副本;
      • 副本的工作机制是怎样的呢?
        • 生产者只向领导者副本写消息,消费者只向领导者副本读消息。追随者副本只向领导者副本发送请求,将最新的生产消息发送给它,使自己能保持同步;这样可以保证消息持久化和不丢失;
      • 那Kafka有没有考虑系统伸缩性的问题呢?
        • 有考虑,伸缩性即Scalability,是分布式系统中必须要考虑的问题,我们设想这样一个场景,领导者副本积累了太多的数据导致单台Broker机器无法容纳了。Kafka的做法是把数据切割成好几份存放在不同的Broker上。这就是所谓的分区Partition。
      • 什么是分区?
        • 你可能听过分片,分区域,譬如MongoDB和ES的Sharding,Hbase的Region。Kafka将一个主题分成多个分区,每一个分区都是一组有序的消息日志。消息只会被发送到一个分区中,Kafka的分区从0开始。
      • 那么分区和副本之间是什么关系呢?
        • 副本在分区这个层次定义,一个分区多个副本,但只能有一个领导者副本。每条消息在分区中的位置由位移来表征。
      • Kafka的三层消息架构是什么?
        • 第一层是主题层,一个主题M个分区,一个分区N个副本;
        • 第二层是分区层,一个分区的N个副本中只有一个是领导副本,其他追随副本仅用以数据冗余;
        • 第三层是消息层,消息的位移从零开始;
      • 前面提到的Broker的消息持久化,请问是怎么实现的?
        • Kafka使用消息日志保存日志,一个日志就是磁盘上只能追加写(Append-Only)的日志文件。只能追加写,避免了缓慢的随机IO操作,改成了性能较好的顺序IO操作。但最终可能会耗尽磁盘空间,Kafka必定会定期清除消息。
      • 解释下Kafka是怎么定期清除消息的?
        • 通过日志段(Log Segment)机制,Kafka底层一个日志会分成多个Segment日志段,消息被追加到当前的日志段,当一个日志段写满时会开辟出新的日志段,久的日志段被封存,定期定时任务删除。
      • 讲一讲P2P和发布订阅在Kafka中的应用?
        • 点对点指的是同一个消息只能被下游的一个消息者消费,Kafka为实现点对点模型而引入了消费组的概念,这组主题的分一个分区只能被消费组的一个实例消费,其他实例不可染指。主要是提高消费者段的吞吐量TPS,多个实例一起消费。消费者实例是运行消费者应用的进程或线程。
      • 在一个消费者组下,一个分区只能被一个消费者消费,但一个消费者可能被分配多个分区,因而在提交位移时也就能提交多个分区的位移。
      • 如果有消费者无法分配到分区,则处于idle游离状态。
      • 要是组内的一个消费者实例挂掉了怎么办?
        • Kafka会自动检测,将之前负责的分区转移给其他的消费者。Rebalance。
      • 消息在分区中的位移是分区位移,在消费者端的位移是消费者位移。
      • 为什么Kafka不像Mysql那样允许副本对外的客户端应用提供读服务?
        • Kafka的读可以从多个Broker读而实现负载均衡,不像Mysql那样的主从,压力都在主上;
        • Kafka的数据持久化和Mysql数据持久化有着本质的区别,Kafka的数据剧透消费的概念,是流数据,需要位移控制,而增加副本的读会增加位移控制的难度;
  • 我有一个问题,Kafka的消费进度是由消费者客户端控制的Offset还是Broke副本控制的Offset,其他的MQ呢?

你可能感兴趣的:(总结与计划)