【背】 消息不丢失,消息不重复,存储机制/网络模型,消息的有序性/顺序
【Kafka】第7题:消息队列,怎么保证消息不丢失?Kafka 14-66
生产者Producer端:同步方式:通过配置ack,确认反馈机制。异步方式:缓冲区满了就阻塞,不要清空缓冲区。发送消息后回调函数,成功则发送下一条,失败则记录日志,脚本扫描重发(可能导致消息的重复)。
消费者Consumer端:关闭自动提交,每次请求Broker消息带上offset。
消息的不重复:Producer:不重要了。Consumer:建立去重表。
-
第14题:如何设计消息队列中间件? 三个方面的设计:通信协议,消息存储,消费者关系维护。 通信协议:JMS(只能Java系统,点对点-一个消费者,发布订阅-多个消费者), AMQP(高级消息队列协议,多种语言多种操作系统) Kafka:基于TCP层自行设计的协议。 消息存储:内存,本地磁盘,分布式文件系统,DB,nosql 消费关系维护:本质就是单播(点到点)或者广播(一点对多点) 消息队列其他高级特性:消息的顺序,投递的可靠性,消息持久化,事务,消息的重试
-
29.Kafka如何解决数据堆积。 开启多线程加快消费。
-
30.kafka消息的存储机制。 kafka消息的结构,从大到小:Topic>>partition/副本>>segment文件>>index/log 一个topic可以被拆分为多个partition进行存储,每个partition有副本,作为容灾准备;每个partition是由segment文件组成;每个segment文件俩组成,index索引文件,主要是存储数据和位置的关系;log文件,存储数据。
-
31.如何用kafka保证消息的有序性。 ⼀个 topic,有三个 partition,指定一个 key,比如指定订单 id 为 key,那么这个订单相关的数据,会被分发到同⼀个 partition,⽽且这个 partition的数据⼀定是有顺序。 消费者从 partition 中取出来数据的时候,也一定是有顺序的。 多个线程并发跑, 顺序就乱了。 解决:写 N 个内存queue,具有相同 key 的数据都到同⼀内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue ,这样保证顺序性。
-
32.kafka如何保证并发情况下消息只被消费一次。 并发消费时,消息的offset存储起来,比如mysql,redis等。
第9题:kafka怎么保证数据不丢失,以及确保消息不会被重复消费。还问了消息送达确认是怎么做的。 消息不丢失:生产方/同步模式:开启ack机制,Producer每次发送消息给Broker收到确认消息。生产方/异步模式:buffer控制数据的发送,buffer满了数据还没有发送出去设置的是立即清理模式会丢数据,设置为阻塞模式。消费方:本地记录消息消费的offset值,向Broker请求消息时带上offset。 消息确认送达:ack机制。-1:Producer确认所有partition成功接收消息才认为成功。1默认:Producer确认一个leader partition成功接收消息才认为成功。0:Producer确认消息发送即可,可能会丢消息。
- 第16题:Kafka的存储模型和网络模型。 kafka的存储模型:一个topic由多个partition组成,每个partition还有自己的副本,一个partition由多个segment组成,segment由index索引文件和log日志文件组成。 kafka的网络模型:Kafka的网络通信模型是基于NIO的Reactor多线程模型。 1(1个Acceptor线程)+N(N个Processor线程)+M(M个业务处理线程)。 1个Acceptor线程,负责监听Client端发起的请求。 N个Processor线程,负责对Socket进行读写。 M个Worker线程,处理具体的业务逻辑并生成Response返回。
Kafka怎么保证数据可靠性?讲了生产者端发送消息到broker持久化,分区和副本机制,消费者消费消息的at-least-once和at-most-once?怎么实现Exactly-Once?14-69 OK 数据可靠性:有答案。 at-least-once:消息至少消费一次:取消自动commit机制,消费端存储offset,每次读取消息带上offset at-most-once & Exactly-once:partition的数据是有序的,读取一次消息后,在消费端实现过滤重复机制。
Kafka怎么保证数据可靠性?14-69
书 & 笔记《Kafka技术内幕》 1Kafka入门 消息系统两种消息模型:队列/点对点模式,发布/订阅(多个消费者订阅主题/Topic) 日志文件:分布式分区/partition, 每个partition是有序的 每条消息:键值,时间戳 为什么Kafka读写磁盘快:1预读:提前读取比较大的磁盘块到内存,2后写:小的写合并成大的物理写。磁盘缓存:所有剩余的内存空间都用作磁盘缓存,内存中尽可能多的写操作一次性刷新到文件系统/磁盘。 零拷贝:从文件系统读取到缓冲区,从缓冲区直接发送到网络接口。 Kafka消息的有序性:每个partition有序,但是一个partition只能一个线程读取,解决:消息上加key相同的key消息发送到同一个partition保证了消息的有序性。 Kafka副本机制与容错:一些分区的主副本/partition,同时也是其他分区的备份副本。提交写消息到主副本,备份副本没有同步到消息不算写入成功。 2生产者 组成:消费者consumer,生产者producer,消息代理broker 生产者和消费者,都属于客户端。 生产者发送消息:先在客户端把消息放入队列中,然后一个消息发送线程从队列拉取消息,批量的方式发送给broker。 发送消息模式:异步模式/不关心服务器处理完消息接着发送下一条消息1, 同步模式/生产者发送完消息后,等待服务器返回成功后,继续发送下一条,Future.get方法。 消息发送给哪个partition:没有key定义则轮训发送到不同partition,指定key可以同一个key发送指定partition。
阿斯顿