kafka
文章平均质量分 67
zhifeng687
这个作者很懒,什么都没留下…
展开
-
kafka2.2源码分析之handleEndTxnRequest
producer epochTransactionalId能关联producer,也需要避免两个使用相同TransactionalId的producer同时存在,所以引入了producer epoch来保证对应一个TransactionalId只有一个活跃的producer epoch。TransactionStateManagerTransactionStateManger是Tran...原创 2015-12-04 14:48:54 · 737 阅读 · 0 评论 -
kafka实现消息高可靠性的机制
消息可靠性维度消息的可靠性性一般需要从三个维度进行考量。分别是生产端、服务端、消费端。发送端可靠性:生产者需要确保消费发送到了服务端机器上。服务端存储可靠性:服务端需要保证消息的持久化不丢失。消费可靠性:消费端需要确认每条消息都被成功进行消费。producer可靠性对于kafka生产端来说,发送消息主要有两类API可以调用,分别是producer.send(msg)和producer.send(msg,callback)。producer.send(msg):俗称“发后即忘”,不转载 2022-03-29 01:02:57 · 751 阅读 · 0 评论 -
kafka中partition和消费者对应关系
1个partition只能被同组的一个consumer消费,同组的consumer则起到均衡效果消费者多于partitiontopic: test 只有一个partition创建一个topic——test,bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test在g2组中启动两个consumer,1. bin/kafk转载 2015-12-08 17:20:12 · 974 阅读 · 0 评论 -
kafka的客户端缓冲池技术
无标题文档.user_btn { width: 60px; height: 30px; background: #FC9; -moz-border-radius: 15px; -webkit-border-radius: 15px; border-radius: 15px; text-align: center;}function shoucang(whic转载 2016-05-18 20:09:31 · 27713 阅读 · 0 评论 -
kafka2.2源码分析之Partition和Replica
Partition概述Partition记录了一个partition的所有replica的相关信息,其中包括了local replica、leader replica的信息。每个Partition都维护着一个LeaderEpoch、TopicPartition、localBrokerId、leaderReplicaId、AR(all replicas)集合和ISR(in-sync repl...原创 2015-08-14 20:04:02 · 852 阅读 · 0 评论 -
kakfka2.2源码分析之handleFetchRequest
概述KafkaApis#handleFetchRequest方法/** * Handle a fetch request */ def handleFetchRequest(request: RequestChannel.Request) { val versionId = request.header.apiVersion val clientId = ...原创 2017-02-15 17:35:40 · 777 阅读 · 0 评论 -
kakfka2.2源码分析之follower副本fetchRequest
AbstractFetcherThread#maybeFetch方法private def maybeFetch(): Unit = { val (fetchStates, fetchRequestOpt) = inLock(partitionMapLock) { val fetchStates = partitionStates.partitionStateMap.as...原创 2017-02-15 15:59:15 · 746 阅读 · 0 评论 -
kafka2.2源码分析之consumer端offsetsForTimes
概述kafka 0.10.1版本之后,consumer端支持根据时间戳获取offset,再重放到该offset处开始消费。consumer端根据指定时间戳找到offset开始消费的代码示例如下:consumer.subscribe(topicA);consumer.poll(100);//正常订阅topic和poll消息Set<TopicPartition> ass...原创 2017-02-15 18:26:33 · 5926 阅读 · 0 评论 -
kafka2.2源码分析之Log日志存储
概述Log由一系列LogSegment组成,每个LogSegment都有一个base offset,表示该段中的第一条消息。新的LogSegment会根据Log的配置策略来创建。配置策略控制了LogSegment的字节大小和创建的时间间隔。成员变量dirLogSegment的创建目录。LogStartOffset可以暴露给client端的最早offset。LogSta...原创 2018-05-03 10:59:07 · 663 阅读 · 0 评论 -
kafka2.2源码分析之follower副本truncateToEpochEndOffsets
概述follower副本向leader副本发送OffsetForLeaderEpochRequest后,leader副本返回大于requestedLeaderEpoch的最小Epoch的startOffset。follower副本会根据返回的leaderEpoch和offset进行日志截断。首先,我将通过一个例子来说明follower副本向leader副本请求OffsetForLead...原创 2016-03-25 21:01:26 · 2545 阅读 · 0 评论 -
kafka2.2源码分析之handleOffsetForLeaderEpochRequest
概述OffsetForLeaderEpoch api仅用于内部broker之间的通信,并且要求集群的许可。在KIP-320中,consumer端也使用这个api去检查在leader change后是否发生日志截断。首先,我将通过一个例子来说明follower副本向leader副本请求OffsetForLeaderEpoch的过程A(leader, epoch=1): 1, 2, 3, ...原创 2016-11-01 17:49:17 · 903 阅读 · 0 评论 -
kafka2.2源码分析之幂等设计实现(exactly once语义实现)
概述幂等性生产者能实现单个producer对同一个<topic ,partition>的exactly once语义。producer端Producer 后台发送线程 Sender,在 run() 方法中,会先根据 TransactionManager 的 shouldResetProducerStateAfterResolvingSequences() 方法判断当前的 P...原创 2015-12-09 17:04:05 · 635 阅读 · 0 评论 -
kafka2.2源码分析之SocketServer —— Reactor多线程模型实现(二)
Processor一、run()方法逻辑override def run() { startupComplete() try { while (isRunning) { try { // setup any new connections that have been queued up//从SocketChannel队列...原创 2015-08-01 11:50:49 · 529 阅读 · 0 评论 -
kafka2.2源码分析之KafkaRequestHandler —— Reactor多线程模型实现(三)
run方法逻辑def run() { while (!stopped) { // We use a single meter for aggregate idle percentage for the thread pool. // Since meter is calculated as total_recorded_value / time_window ...原创 2015-08-01 11:57:30 · 572 阅读 · 0 评论 -
kafka2.2源码分析之handleProduceRequest
handleProduceRequest该方法的流程如下:前置检查,判断ProduceRequest中是否含有事务record,或者幂等record。 迭代ProduceRequest的partitionRecord,partitionRecord是一个(topicPartition, memoryRecords)的二元组。 如果brocker的元数据缓存包含该topicPartiti...原创 2015-08-11 15:55:57 · 831 阅读 · 0 评论 -
kafka2.2源码分析之BufferPool(客户端缓冲池技术)
概述 BufferPool是缓存给定memory大小的ByteBuffer池。这个类主要应用于Producer的需求。因此,它有以下2个属性:只有符合pooled size大小的ByteBuffer会被缓存并循环使用。 BufferPool是公平的,内存优先给等待时间最长的线程使用,除非它有充足的内存。它能有效防止线程饥饿和死锁的发生。Pooled Buffer Memory &a...原创 2019-04-11 20:48:58 · 392 阅读 · 0 评论 -
kafka2.2源码分析之KafkaChannel
概述KakfaChannel基本是对SocketChannel的封装,只是这个中间多个一个间接层:TransportLayer,为了封装普通和加密的Channel。TransportLayer子类有PlaintextTransportLayer和SslTransportLayer,分别对应普通和加密的channel。而对于KafkaChannel提供统一的接口,这是策略模式很好的应用。Ka...原创 2019-03-31 19:45:13 · 1017 阅读 · 0 评论 -
kafka2.2源码分析之leader epoch
概述Kafka使用HW值来决定副本备份的进度,而HW值的更新通常需要额外一轮FETCH RPC才能完成,故而这种设计是有问题的。它们可能引起的问题包括:备份数据丢失 备份数据不一致Kafka 0.11版本之后引入了leader epoch来取代HW值。Leader端多开辟一段内存区域专门保存leader的epoch信息,这样即使出现上面的两个场景也能很好地规避这些问题。Epoch...原创 2015-12-03 21:31:01 · 1383 阅读 · 0 评论 -
Transactions in Apache Kafka
在上一篇博客中,我们介绍了kafka的一次性语义。这篇博客将涵盖多个消息投递语义,介绍幂等生产者、事务生产者以及kafka stream的一次性语义。Transactional Semanticsatomic multi-partition writesTransaction实现了写入多个topic和partition的原子写入。例如,如果消费者在topic partition tp0...翻译 2015-12-04 11:48:06 · 462 阅读 · 0 评论 -
kafka2.2源码分析之服务端处理 findCoordinator 请求
概述分布式事务:producer可能会给多个topic,多个partition发消息,这些消息也需要能放在一个事务里面,这就形成了一个典型的分布式事务。事务协调者:因为producer发送消息可能是分布式事务,所以引入了常用的2PC,所以有事务协调者(Transaction Coordinator)。Transaction Coordinator和之前为了解决脑裂和惊群问题引入的Group...原创 2015-12-04 15:33:47 · 1130 阅读 · 0 评论 -
kafka2.2源码分析之服务端处理初始化ProducerId请求
概述control message:因为事务存在commit和abort两种操作,而客户端又有read committed和read uncommitted两种隔离级别,所以消息队列必须能标识事务状态,这个被称作Control Message。为了区分写入Partition的消息被Commit还是Abort,Kafka引入了一种特殊类型的消息,即Control Message。该类消...原创 2015-12-04 15:35:21 · 1368 阅读 · 0 评论 -
kafka2.2源码分析之AddPartitionsToTxnRequest
kafkaProducer调用send()方法发送数据判断是否启用事务,如果启用事务,添加包含消息的parition到事务缓冲队列中。if (transactionManager != null && transactionManager.isTransactional()) transactionManager.maybeAddPart...原创 2015-12-08 16:56:03 · 752 阅读 · 0 评论 -
kafka2.2源码分析之SocketServer —— Reactor多线程模型实现
AcceptorAcceptor初始化//初始化Selectorprivate val nioSelector = NSelector.open()//初始化ServerSocketChannel val serverChannel = openServerSocket(endPoint.host, endPoint.port) private val processors ...原创 2015-08-01 11:04:48 · 524 阅读 · 0 评论