本文是笔者双十一系列第二弹,源于一个双十一期间一个让笔者猝不及防的生产故障,本文将详细剖析Kafka的副本机制,以及ISR频繁变更(扩张与伸缩)为什么会导致集群不可用。1、Kafka副本机制Kafka数据组织方式是topicparition的结构,每一个topic可以设置多个分区,各个分区的数据是topic数据的一部分(数据分片),为了保证单个分区的高可用行,又引入了副本机制,即一个分区的数据会存储多份,避免单点故障.一个3节点的Broker集...
2023-04-25 17:11:21 2867浏览 0点赞 0回复 0收藏
讲真,我今年的双十一有点“背”,负责的Kafka集群出了一些幺蛾子,但正是这些幺蛾子,让我这个双十一过的非常充实,也让我意识到如果不体系化学习Kafka,是无法做到生产集群及时预警,将故障扼杀在摇篮中,因此也下定决心研读kafka的内核。本文就先来分享一个让我始料未及的故障:Kafka生产环境大面积丢失消息。首先要阐述的是消息丢失并不是因为断电,而且集群的副本数量为3,消息发送端设置的acks1(all)。这样严苛的设置,那...
2023-04-25 17:10:24 4171浏览 0点赞 0回复 0收藏
从官方这边获悉,RocketMQ在4.9.1版本中对消息发送进行了大量的优化,性能提升十分显著,接下来请跟着我一起来欣赏大神们的杰作。根据RocketMQ4.9.1的更新日志,我们从中提取到关于消息发送性能优化的【Issues:2883】,详细链接如下:具体优化点如截图所示:首先先尝试对上述优化点做一个简单的介绍:对WaitNotifyObject的锁进行优化(item2)移除HAService中的锁(item3)移除GroupCommitService中的锁(item4)消除HA中不必要的数组...
2023-04-25 17:09:31 2310浏览 0点赞 0回复 0收藏
采用何种线程交互模型,如何高效率的提高网络处理能力是面向网络编程中一个非常重要的议题。深入研究KafkaBroker服务端线程模型也是理解Kafka工作机制必备不可少的一环。本文的探讨主要分成如下三个部分:网络相关配置参数图解线程模型工作机制对Kafka线程模型的一点思考1、网络相关的配置参数KafkaBroker端与网络相关的线程主要被分成network、IO两类线程,与之对应的是Kafka分别提供了两个参数用来设置其线程个数,分别如下:...
2023-04-25 17:08:33 2641浏览 0点赞 0回复 0收藏
一看这个标题我想大家一定进来想“怼”我,你这不是小题大作吗?在java中打印日志不是一件非常简单的事情吗?在java中常用的日志级别为DEBUG、INFO、WARN、ERROR四个日志级别。通常开发环境开启DEBUG,生产环境开启INFO级别,采用主流的日志采集工具包诸如log4j、logback。但日志输出真的有这么简单吗?其实里面蕴含着很多的规范,或者是最佳实践,并且还有一些非常有用设计技巧方便查询关联日志的技巧,容我慢慢道来。输出日志...
2023-04-25 17:07:44 2963浏览 0点赞 0回复 0收藏
Broker端与客户端的心跳在Kafka中非常的重要,因为一旦在一个心跳过期周期内(默认10s),Broker端的消费组组协调器(GroupCoordinator)会把消费者从消费组中移除,从而触发重平衡。在2.4.x以下其版本中,消费组一旦进入重平衡状态,该消费组内所有消费者全部暂停消费,直到重平衡完成。本文将来探讨Kafka的心跳机制的具体实现。本文的组织结构如下:源码解读Kafka心跳机制Kafka心跳架构设计亮点(时间轮调度算法实现原理图)温馨提...
2023-04-24 17:48:50 2901浏览 0点赞 0回复 0收藏
笔者最近在负责全司数据同步产品化的设计与开发,其设计宗旨:实现任意数据源到任意目标端的数据准实时同步,其中一个非常常见的场景:MySQL数据同步到ES,本文的着力点就在如何提高Binlog的拉取与解析效率设计。1、场景描述了解过mysql主从同步机制的童鞋们应该都知道是基于binlog实现,mysql增量同步的核心设计理念:将同步线程“伪装”为需要同步的mysql节点的从节点(slave),主动向mysql主节点发送dump请求即可获得主节点的...
2023-04-24 17:48:20 3527浏览 0点赞 0回复 0收藏
如果大家从事的是业务开发,在工作中如果涉及到并发,通常是引入线程池来实现并发。但如果从事的是基础框架的开发,通常并不会直接使用线程池,会按需创建单个线程,并且为了职责的单一与提升性能,通常单个线程只会负责一个流程中的部分功能,多个线程紧密配合。那线程与线程之间如何协作呢?如果子线程出现异常,如何通知主线程呢?可以明确的告诉大家,子线程抛出异常,主线程是无法捕获到异常的。请带着上述问题,开始本文...
2023-04-24 17:47:52 2741浏览 0点赞 0回复 0收藏
学习的主要目的是知识储备,最终运用在生产实践中,助力工作,同样对于多线程的学习,希望我们也能够在生产过程中灵活运用。接下来和大家谈谈在Java中同步转异步的技巧。1、线程池+Future模式笔者在公司中负责开发某一个产品时,需要实现一个告警模块,告警通知方式需要为钉钉群、电话短信等方式,并且及时时单一的告警方式,例如钉钉群告警,也需要同时发送到多个群(监控中心、业务项目组钉钉群),使监控告警能真正通知到各个...
2023-04-24 17:46:55 3510浏览 0点赞 0回复 0收藏
正确理解锁是深入理解Java并发的重中之重。接下来和笔者一步一步进入"Java的锁世界"中来吧,本文将循序渐进的介绍锁的相关知识,从简单到难,从概念到实践思路。1、锁的种类首先以一个非常常见的生活场景举例,例如一个三口之家居住在一个二房一厅的房子里,只有一个卫生间,早上一起床,大家是不是都有抢卫生间,这里就会发生一个有意思的事情了,一人在如厕,其他人排队等待的场景。这个场景下有如下几个关键的特征:独占“厕...
2023-04-24 17:28:54 2739浏览 0点赞 0回复 0收藏
1、主从多Reactor模型不知道大家有没有发现面向网络编程的框架都非常突出线程模型,其实也不难理解,因为网络编程是IO密集型,合理使用线程对提高性能有着非常显著的作用。在网络编程模型中,有一个非常经典的线程模型:主从多Reactor模型,其示意图如下所示:我们首先简单介绍一下上图中涉及的几个重要角色:Acceptor请求接收者,在实践时其职责类似服务器,并不真正负责连接请求的建立,而只将其请求委托MainReactor线程池来...
2023-04-24 17:27:30 2530浏览 0点赞 0回复 0收藏
在详细介绍Kafka拉取之前,我们再来回顾一下消息拉取的整体流程:在消费者加入到消费组后,消费者Leader会根据当前在线消费者个数与分区的数量进行队列负载,每一个消费者获得一部分分区,接下来就是要从Broker服务端将数据拉取下来,提交给消费端进行消费,对应流程中的pollForFetches方法。要正确写出优秀的Kafka端消费代码,详细了解其拉取模型是非常重要的一步。1、消息拉取详解1.1消费端拉取流程详解消息拉取的实现入口为...
2023-04-24 17:25:03 4256浏览 0点赞 0回复 0收藏
上一篇文章对消费组有了一个全局基本的了解后,从本文开始将对消息者的核心工作机制逐一深入探讨。1、队列重平衡概述如果对RocketMQ或者对消息中间件有所了解的话,消费端在进行消息消费时至少需要先进行队列(分区)的负载,即一个消费组内的多个消费者如何对订阅的主题中的队列进行负载均衡,当消费者新增或减少、队列增加或减少时能否自动重平衡,做到应用无感知,直接决定了程序伸缩性,其说明图如下:本节将聚集Kafka消费端...
2023-04-24 17:24:17 2522浏览 0点赞 0回复 0收藏
本文是《跟我学Kafka:从零开始学习Kafka》的第6篇,跟着我开启从小白到专家的进阶之旅。本文将对KafkaConsumer做一个简单的介绍,是深入研究KafkaConumer的一扇窗。主要从如下三个方面展开:核心参数核心组件核心API1、KafkaConsumer核心参数览个人觉得,要想深入了解KafkaConsumer的核心工作机制可以从它的核心参数切入,为后续深入了解它的队列负载机制、消息拉取模型、消费模型、位点提交等机制打下基础。kafkaConsumer的核...
2023-04-24 17:22:55 6025浏览 0点赞 0回复 0收藏
1、抛出问题笔者最近在折腾数据异构体系,在实现MySQL增量数据同步到MQ(Kafka、RocketMQ),本文的故事就从这里开始。众所周知,为了提高写入端的并发性能,通常会采用多线程并发机制,提高写入端的性能,接下来基于MySQL增量同步到Kafka为例,阐述一下第一版的架构方案。真实的数据同步架构设计复杂性远比上面复杂,上图旨在阐述Kafka的使用特点:为了提高性能,通常会引入多线程,故组内同事直接采用多线程,通过创建多个线程,...
2023-04-24 17:15:23 3527浏览 0点赞 0回复 0收藏
本文主要介绍如何将RocketMQ集群从原先的主从同步升级到主从切换。本文首先介绍与DLedger多副本即RocketMQ主从切换相关的核心配置属性,然后尝试搭建一个主从同步集群,最后将原先的RocketMQ集群平滑升级到DLedger集群的示例,并简单测试一下主从切换功能。1、RocketMQ主从切换核心配置参数详解其主要的配置参数如下所示:enableDLegerCommitLog是否启用DLedger,即是否启用RocketMQ主从切换,默认值为false。如果需要开启主从...
2023-02-22 15:08:21 4871浏览 0点赞 0回复 0收藏
本文将在RocketMQ消息发送systembusy、brokerbusy原因分析与解决方案的基础上,结合生产上的日志尝试再次理解brokerbusy以及探讨解决方案。首先,brokerbusy相关的日志关键字如下:[REJECTREQUEST]systembusytoomanyrequestsandsystemthreadpoolbusy[PCSYNCHRONIZED]brokerbusy[PCBUSYCLEANQUEUE]brokerbusy[TIMEOUTCLEANQUEUE]brokerbusy上述前面4个关键字在上篇文章中已详细介绍,本文先对出现上述错误进行一个总结,...
2023-02-22 15:01:17 3321浏览 0点赞 0回复 0收藏
1、背景公司一个RocketMQ集群由4主4从组成,突然其中3台服务器“竟然”在同一时间下线,其监控显示如下:依次查看三台机器的监控图形,时间戳几乎完美“吻合”,不可思议吧。2、故障分析出现问题,先二话不说,马上重启各服务器,尽快恢复集群,降低对业务的影响,接下来开始对日志进行分析。Java进程自动退出(rocketmq本身就是一个java进程),一种最常见的问题是由于内存溢出或由于内存泄漏导致进程发送Crash等。由于我们的启...
2023-02-22 14:58:25 4961浏览 0点赞 0回复 0收藏
温馨提示:整个KafkaClient专栏基于kafka2.3.0版本。1、KafkaProducer概述根据KafkaProducer类上的注释上来看KafkaProducer具有如下特征:KafkaProducer是线程安全的,可以被多个线程交叉使用。KafkaProducer内部包含一个缓存池,存放待发送消息,即ProducerRecord队列,与此同时会开启一个IO线程将ProducerRecord对象发送到Kafka集群。KafkaProducer的消息发送APIsend方法是异步,只负责将待发送消息ProducerRecord发送到缓存...
2023-02-22 14:57:38 3636浏览 0点赞 0回复 0收藏
温馨提示:本文基于Kafka2.2.1版本。本文主要是以源码的手段一步一步探究消息发送流程,如果对源码不感兴趣,可以直接跳到文末查看消息发送流程图与消息发送本地缓存存储结构图。从上文初识KafkaProducer生产者,可以通过KafkaProducer的send方法发送消息,send方法的声明如下:Future<RecordMetadata>send(ProducerRecord<K,V>record)Future<RecordMetadata>send(ProducerRecord<K,V>record,Callbackcallback)从上面的...
2023-02-22 14:56:08 3301浏览 0点赞 0回复 0收藏