
消息中间件
文章平均质量分 80
kafka, rabbitmq, rocketmq,activemq等中间件相关技术
朱小厮
你知道的越多 你不知道的也就越多
展开
-
为了追求极致的性能,Kafka掌控这11项要领
很多同学私信问我Kafka在性能优化方面做了哪些举措,对于相关问题的答案其实我早就写过了,就是没有系统的整理一篇,最近思考着花点时间来整理一下,下次再有同学问我相关的问题我就可以潇洒的甩个链接了。这个问题也是Kafka面试的时候的常见问题,面试官问你这个问题也不算刁难你。在网上也有很多相关的文章开讲解这个问题,比如之前各大公众号转载的《为什么Kafka这么快?》,这些文章我看了,写的不错,问题在于...原创 2019-06-26 19:57:02 · 3785 阅读 · 10 评论 -
Kafka主题中的分区数越多吞吐量就越高?BULLSHIT!!!
分区是Kafka中最小的并行操作单元,对于生产者而言,对于每一个分区的数据写入是完全可以并行化的;对于消费者而言,Kafka只允许单个分区中的消息被一个消费者线程所消费,一个消费组的消费并行度完全依赖于所消费的分区数。如此看来,如果一个主题中的分区数越多,理论上所能达到的吞吐量就越大,那么事实真的如预想的一样么?不妨我们使用kafka-producer-perf-test.sh脚本和kafka-...原创 2019-06-26 19:59:58 · 4803 阅读 · 3 评论 -
聊一聊Kafka分区的隐藏属性——二次归类
在使用Kafka的过程中,分区是一个不可忽视的概念。很多时候你会带着这样的疑问:Kafka的分区该怎么划分?按什么划分?分多少个?撰稿之时,我在《深入理解Kafka》一书中搜索了一下“分区”这个词,结果发现出现的频率至少有4位数之多。Kafka中分区的概念涉猎很多,比如:分区分配、分区重分配、失效分区等。在本公众号里也发表过几篇文章来讲述Kafka分区中的某些知识点:如何为Kafka挑选合适的...原创 2019-06-04 02:48:15 · 917 阅读 · 1 评论 -
打磨两月,电子版《深入理解Kafka》重新回归!!!
自从3月8日将原本的电子版下架后已有两月有余,今日重新将电子版的《深入理解Kafka》以掘金小册的形式上线。掘金没有推广,只能我自己上了,如有打扰,还望海涵。原本的电子版在亚马逊以及京东上都短暂存在过,将他们下线是因为:1. 这2个平台的电子版定价太高。 说实话,若不是经常看下这些平台的情况,真不知道电子版会上线,因为事先约定的是暂不上线。其次,电子版的定价我事先也不知晓,亚马逊的定价是82....原创 2019-05-10 23:48:46 · 7307 阅读 · 18 评论 -
干趴面试官系列 | 请你简述一下Kafka中的分区分配
“请你简述一下Kafka中的分区分配”,当面试官问你这个问题的时候,你会怎么回答?其实,这道题目里面就暗藏汹涌,因为Kafka中的分区分配在多处出现,而这个问题的表述方式是在潜意识里暗示你回答一种,这样在你自认为很完美的回答完这个问题之后,面试官会冷不丁的来一句:还有呢?当你回答完一个点的时候,面试官来一句还有呢,当你再补上一个的时候,他还是会来一句还有呢,就算你又补上第三个的时候,他还是会来一...原创 2019-04-26 01:32:23 · 5916 阅读 · 18 评论 -
Kafka科普系列 | 原来Kafka中的选举有这么多?
面试官在考查你Kafka知识的时候很可能会故弄玄虚的问你一下:Kafka中的选举时怎么回事?除非问你具体的哪种选举,否则问这种问题的面试官多半也是对Kafka一知半解,这个时候就是“弄死”他的时候。当然如果你没有一定的知识储备,那么就是你被“弄死”的时候。一般问这个问题,那么他肯定知道其中的一种,比如分区leader的选举。所谓分区leader的选举就是当ISR中的leader副本歇菜了,再重新...原创 2019-04-18 02:02:25 · 4845 阅读 · 14 评论 -
Kafka科普系列 | 轻松理解Kafka中的延时操作
本文起源于之前去面试的一道面试题,面试题大致上是这样的:消费者去Kafka里拉去消息,但是目前Kafka中又没有新的消息可以提供,那么Kafka会如何处理?如下图所示,两个follower副本都已经拉取到了leader副本的最新位置,此时又向leader副本发送拉取请求,而leader副本并没有新的消息写入,那么此时leader副本该如何处理呢?可以直接返回空的拉取结果给follower副本,不...原创 2019-04-16 08:37:23 · 9820 阅读 · 1 评论 -
Kafka科普系列 | Kafka中的事务是什么样子的?
事务,对于大家来说可能并不陌生,比如数据库事务、分布式事务,那么Kafka中的事务是什么样子的呢?在说Kafka的事务之前,先要说一下Kafka中幂等的实现。幂等和事务是Kafka 0.11.0.0版本引入的两个特性,以此来实现EOS(exactly once semantics,精确一次处理语义)。幂等,简单地说就是对接口的多次调用所产生的结果和调用一次是一致的。生产者在进行重试的时候有可能...原创 2019-04-09 09:56:29 · 32555 阅读 · 3 评论 -
Kafka科普系列 | 什么是LSO?
很多同学对于Kafka的认知仅限于在LEO和HW之间,有可能认知还出现错误,对此记住一点,这两个都是指最后一条的下一条的位置而不是指最后一条的位置。不过本文的关注点不在于此,而在于LSO这个概念。如果需要了解LEO和HW的同学可在文末留言,后面也可以考虑出个科普LEO和HW的文章。LSO特指LastStableOffset,在上一篇《Kafka科普系列 | 什么是LW和logStartOffse...原创 2019-04-03 02:00:37 · 7551 阅读 · 4 评论 -
Kafka科普系列 | 什么是LW和logStartOffset?
欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。很多读者对 Kafka 中的 HW 的概念并不陌生,但是却并不知道还有一个 LW 的 概念。HW 是 High Watermark 的缩写,俗称高水位,它标识 了一个特定的消息偏移量(offset),消费者只能拉取到这个 offset 之前的消息。如上图...原创 2019-04-01 00:58:48 · 3906 阅读 · 1 评论 -
Kafka最全面试题整理|划重点要考
欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。有很多人问过我要过Kafka相关的面试题,我一直懒得整理,这几天花了点时间,结合之前面试被问过的、别人咨询过的、我会问别人的进行了相关的整理,也就几十题,大家花个几分钟看看应该都会。面试题列表如下:Kafka的用途有哪些?使用场景如何?Kafka中的I...原创 2019-03-14 12:55:18 · 15064 阅读 · 16 评论 -
《深入理解Kafka:核心设计与实践原理》笔误及改进记录
2019年2月下旬笔者的有一本新书——《深入理解Kafka:核心设计与实践原理》上架,延续上一本《RabbitMQ实战指南》的惯例,本篇博文用来记录现在发现的一些笔误,一是给购书的朋友一个参考,以防被笔误所迷惑;二是提供一个记录笔误的地方,方便再次印刷修改之用,这样也能进一步的完善这本书。本书出版之前已校稿多次,也邀请了专业的技术小伙伴进行校稿,但还是会有漏网之鱼,还望各位海涵。(本文长期更新)...原创 2020-05-07 18:57:45 · 11762 阅读 · 43 评论 -
为什么Kafka中的分区数只能增加不能减少?
欢迎支持《RabbitMQ实战指南》以及关注微信公众号:朱小厮的博客。当一个主题被创建之后,依然允许我们对其做一定的修改,比如修改分区个数、修改配置等,这个修改的功能就是由kafka-topics.sh脚本中的alter指令所提供。我们首先来看如何增加主题的分区数。以前面的主题topic-config为例,当前分区数为1,修改为3,示例如下:[root@node1 kafka_2.11-...原创 2018-09-21 17:14:29 · 17187 阅读 · 3 评论 -
如何把一个运行完好的Kafka搞崩溃
Kafka其实也只是一个JVM进程,要想把一个进程搞崩溃,相信大家的nice idea(骚操作)也不少。本文中只是用了一种很常见的方式来使得Kafka的进程崩溃,通过分析崩溃的原因来让我们可以更合理的使用Kafka。你可以试着在一台普通的Linux机器上创建10000个分区的主题。比如下面示例中创建一个主题topic-bomb:[root@node1 kafka_2.11-2.0.0]# bi...原创 2018-09-21 17:12:12 · 5122 阅读 · 1 评论 -
[Kafka与Spark集成系列四] Spark运行结构
在分布式环境下,Spark集群采用的是主从架构。如下图所示,在一个Spark集群中,有一个节点负责中央协调,调度各个分布式工作节点,这个中央协调节点被称为驱动器(Driver)节点,与之对应的工作节点被称为执行器(Executor)节点。驱动器节点可以和大量的执行器节点进行通信,它们也都作为独立的进程运行。驱动器节点和所有的执行器节点一起被称为一个Spark应用(Application)。...原创 2018-08-26 16:56:55 · 1547 阅读 · 0 评论 -
[Kafka与Spark集成系列三] Spark编程模型
在Spark中,我们通过对分布式数据集的操作来表达我们的计算意图,这些计算会自动地在集群上并行进行。这样的数据集被称为弹性分布式数据集(Resilient Distributed Dataset),简称RDD。RDD是Spark对分布式数据和计算的基本抽象。在Spark中,对数据的所有操作不外乎创建RDD、转换已有RDD以及调用RDD操作进行求值。在《Spark的安装及简单应用》的单词统计示例中,...原创 2018-08-26 16:54:27 · 1132 阅读 · 0 评论 -
[Kafka与Spark集成系列二] Spark的安装及简单应用
下载Spark安装包是安装的第一步,下载地址为http://spark.apache.org/downloads.html。截止撰稿之时,Spark最新版本为2.3.1,如下图所示,我们可以从官网中选择spark-2.3.1-bin-hadoop2.7.tgz进行下载。在下载过后,笔者是先将安装包拷贝至/opt目录下,然后执行相应的解压缩动作,示例如下:[root@node1 op...原创 2018-08-26 16:48:00 · 1954 阅读 · 0 评论 -
[Kafka与Spark集成系列一] Spark入门
Spark是一个用来是实现快速而通用的集群计算的平台。Spark是UC Berkeley AMP Lab(加州大学伯克利分销的AMP实验室)所开源的类MapReduce的通用并行框架, 现在已经是Apache中的一个顶级项目。Spark使用Scala语言开发,支持Scala、Java、Python、R语言相关的API,运行于JVM之上。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,...原创 2018-08-26 16:41:38 · 4050 阅读 · 0 评论 -
Kafka分区分配策略(4)——分配的实施
接上文: 1.【Kafka分区分配策略(1)——RangeAssignor】 2.【Kafka分区分配策略(2)——RoundRobinAssignor和StickyAssignor】 3.【Kafka分区分配策略(3)——自定义分区分配策略](https://blog.youkuaiyun.com/u013256816/article/details/81123858)】分配的实施我们...原创 2018-07-19 22:25:45 · 2764 阅读 · 2 评论 -
Kafka分区分配策略(3)——自定义分区分配策略
接上文: 1.【Kafka分区分配策略(1)——RangeAssignor】 2.【Kafka分区分配策略(2)——RoundRobinAssignor和StickyAssignor】自定义分区分配策略读者不仅可以任意选用Kafka所提供的3种分配策略,还可以自定义分配策略来实现更多可选的功能。自定义的分配策略必须要实现org.apache.kafka.clients.consum...原创 2018-07-19 22:21:19 · 8070 阅读 · 2 评论 -
Kafka分区分配策略(2)——RoundRobinAssignor和StickyAssignor
接上文【Kafka分区分配策略(1)——RangeAssignor】RoundRobinAssignor分配策略RoundRobinAssignor策略的原理是将消费组内所有消费者以及消费者所订阅的所有topic的partition按照字典序排序,然后通过轮询方式逐个将分区以此分配给每个消费者。RoundRobinAssignor策略对应的partition.assignment.st...原创 2018-07-19 22:04:11 · 11695 阅读 · 25 评论 -
Kafka分区分配策略(1)——RangeAssignor
引言按照Kafka默认的消费逻辑设定,一个分区只能被同一个消费组(ConsumerGroup)内的一个消费者消费。假设目前某消费组内只有一个消费者C0,订阅了一个topic,这个topic包含7个分区,也就是说这个消费者C0订阅了7个分区,参考下图(1)。此时消费组内又加入了一个新的消费者C1,按照既定的逻辑需要将原来消费者C0的部分分区分配给消费者C1消费,情形上图(2),消费者C0...原创 2018-07-19 22:01:48 · 24823 阅读 · 10 评论 -
直击Kafka的心脏——控制器
在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。当检测到某个分区的ISR集合发生变化时,由控制器负责通知所有broker更新其元数据信息。当使用kafka-topics.sh脚本为某个topic增...原创 2018-06-30 12:07:44 · 14183 阅读 · 5 评论 -
Kafka参数图鉴——unclean.leader.election.enable
Kafka参数图鉴——unclean.leader.election.enable如何提高Kafka可靠性是一个可以长篇大论的主题。很多初学者会简单的认为将客户端参数acks设置为-1即可保证Kafka的可靠性,显然这是很片面的观点。就可靠性本身而言,它并不是一个可以用“是”或者“否”来衡量的一个指标,而一般是用几个9来衡量。就参数方面而言,与Kafka可靠性相关的参数不止acks这一个,比如...原创 2018-06-24 11:44:12 · 10819 阅读 · 3 评论 -
Kafka解惑之时间轮(TimingWheel)
Kafka中存在大量的延迟操作,比如延迟生产、延迟拉取以及延迟删除等。Kafka并没有使用JDK自带的Timer或者DelayQueue来实现延迟的功能,而是基于时间轮自定义了一个用于实现延迟功能的定时器(SystemTimer)。JDK的Timer和DelayQueue插入和删除操作的平均时间复杂度为O(nlog(n)),并不能满足Kafka的高性能要求,而基于时间轮可以将插入和删除操作的时间复...原创 2018-06-14 19:42:57 · 39883 阅读 · 26 评论 -
Kafka参数broker.id详解
kafka在启动服务之前必须要设定3个参数:broker.id、log.dirs、zookeeper.connect,这里我们就来重点说一下broker.id这个参数。在Kafka集群中,每个broker都有一个唯一的id值用来区分彼此。Kafka在启动时会在zookeeper中/brokers/ids路径下创建一个与当前broker的id为名称的虚节点,Kafka的健康状态检查就依赖于此节点。当...原创 2018-06-02 11:18:14 · 31575 阅读 · 5 评论 -
Kafka日志清理之Log Compaction
在上一篇文章《Kafka日志清理之Log Deletion》中介绍了日志清理的方式之一——日志删除,本文承接上篇,主要来介绍Log Compaction。Kafka中的Log Compaction是指在默认的日志删除(Log Deletion)规则之外提供的一种清理过时数据的方式。如下图所示,Log Compaction对于有相同key的的不同value值,只保留最后一个版本。如果应用...原创 2018-05-28 19:57:16 · 9338 阅读 · 8 评论 -
Kafka日志清理之Log Deletion
Kafka将消息存储在磁盘中,为了控制磁盘占用空间的不断增加就需要对消息做一定的清理操作。Kafka中每一个分区partition都对应一个日志文件,而日志文件又可以分为多个日志分段文件,这样也便于日志的清理操作。Kafka提供了两种日志清理策略:日志删除(Log Deletion):按照一定的保留策略来直接删除不符合条件的日志分段。日志压缩(Log Compaction):针对每个消息的...原创 2018-05-23 12:35:51 · 31618 阅读 · 12 评论 -
Kafka消息格式中的变长字段(Varints)
kafka从0.11.0版本开始所使用的消息格式版本为v2,这个版本的消息相比于v0和v1的版本而言改动很大,同时还参考了Protocol Buffer而引入了变长整型(Varints)和ZigZag编码。为了更加形象的说明问题,首先我们来了解一下变长整型。Varints是使用一个或多个字节来序列化整数的一种方法。数值越小,其所占用的字节数就越少。Varints中每个字节都有一个位于最...原创 2018-05-13 16:25:44 · 2541 阅读 · 2 评论 -
一文看懂Kafka消息格式的演变
摘要对于一个成熟的消息中间件而言,消息格式不仅关系到功能维度的扩展,还牵涉到性能维度的优化。随着Kafka的迅猛发展,其消息格式也在不断的升级改进,从0.8.x版本开始到现在的1.1.x版本,Kafka的消息格式也经历了3个版本。本文这里主要来讲述Kafka的三个版本的消息格式的演变,文章偏长,建议先关注后鉴定。Kafka根据topic(主题)对消息进行分类,发布到Kafka集群的每条...原创 2018-05-13 16:21:20 · 28828 阅读 · 8 评论 -
再看Kafka Lag
在《Kafka的Lag计算误区及正确实现》一文中提及了kafka.admin.ConsumerGroupCommand.PartitionAssignmentState无法被外部访问,故要么将PartitionAssignmentState前的protected修饰符去掉,要么像《 如何获取Kafka的消费者详情》和《集群管理工具KafkaAdminClient——改造》这两篇这样来实现,但是真的...原创 2018-04-21 19:25:17 · 6642 阅读 · 1 评论 -
Kafka解析之topic创建(3)——合法性验证
前文摘要在《Kafka解析之Topic创建(1)》这篇文章中,我们讲述了创建Topic的方式有两种:如果kafka broker中的config/server.properties配置文件中配置了auto.create.topics.enable参数为true(默认值就是true),那么当生产者向一个尚未创建的topic发送消息时,会自动创建一个num.partitions(默认值为1)...原创 2018-04-18 20:24:10 · 5975 阅读 · 4 评论 -
集群管理工具KafkaAdminClient——改造
前文概述在上一篇文章《集群管理工具KafkaAdminClient——原理与示例》中讲述了KafkaAdminClient的功能以及相应的原理,但是同时也提出了目前的KafkaAdminClient并没有非常的完善,还有许多功能还需要去丰富,这些功能可以自定义实现,在《如何获取Kafka的消费者详情——从Scala到Java的切换》一文中介绍了如何获取Kafka的消费详情,其原理是通过Java...原创 2018-04-18 20:19:55 · 4589 阅读 · 1 评论 -
集群管理工具KafkaAdminClient——原理与示例
前言一般情况下,我们都习惯使用Kafka中bin目录下的脚本工具来管理查看Kafka,但是有些时候需要将某些管理查看的功能集成到系统(比如Kafka Manager)中,那么就需要调用一些API来直接操作Kafka了。在Kafka0.11.0.0版本之前,可以通过kafka-core包(Kafka的服务端代码,采用Scala编写)下的AdminClient和AdminUtils来实现部分的集群...原创 2018-04-18 20:14:46 · 29103 阅读 · 4 评论 -
如何获取Kafka的消费者详情——从Scala到Java的切换
前文摘要在上一篇文章《Kafka的Lag计算误区及正确实现》中介绍了如何计算消费者的消费滞后量(Lag),并且讲解了如何调用Kafka的kafka.admin.ConsumerGroupCommand文件中的KafkaConsumerGroupService来发送OffsetRequest和OffsetFetchRequest两个请求,进而通过两个请求结果之间的差值来获得结果。不过如果你不想修...原创 2018-04-16 23:47:29 · 6691 阅读 · 5 评论 -
Kafka的Lag计算误区及正确实现
前言消息堆积是消息中间件的一大特色,消息中间件的流量削峰、冗余存储等功能正是得益于消息中间件的消息堆积能力。然而消息堆积其实是一把亦正亦邪的双刃剑,如果应用场合不恰当反而会对上下游的业务造成不必要的麻烦,比如消息堆积势必会影响上下游整个调用链的时效性,有些中间件如RabbitMQ在发生消息堆积时在某些情况下还会影响自身的性能。对于Kafka而言,虽然消息堆积不会对其自身性能带来多大的困扰,但难...原创 2018-04-16 01:19:50 · 39087 阅读 · 19 评论 -
消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局
一、前言消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能,其作为分布式系统架构中的一个重要组件,有着举足轻重的地位。目前开源的消息中间件可谓是琳琅满目,能让大家耳熟能详的就有很多,比如Acti...原创 2018-04-07 00:56:44 · 42578 阅读 · 19 评论 -
Kafka解析之topic创建(2)
前言上一篇Kafka解析之topic创建(1)中的介绍了怎样创建一个topic以及对应的replica-assignment参数的一些使用细节,本文继续来讲述一下自动分配方案的具体算法实现,包括未指定机架的分配策略和指定机架的分配策略。承接如果在创建topic的时候并没有指定replica-assignment参数,那么就需要采用kafka默认的分区副本分配策略来创建topic。主要的...原创 2018-02-10 11:18:44 · 4751 阅读 · 4 评论 -
Kafka解析之topic创建(1)
在使用kafka发送消息和消费消息之前,必须先要创建topic,在kafka中创建topic的方式有以下2种:如果kafka broker中的config/server.properties配置文件中配置了auto.create.topics.enable参数为true(默认值就是true),那么当生产者向一个尚未创建的topic发送消息时,会自动创建一个num.partitions(默认值...原创 2018-02-10 11:15:01 · 62783 阅读 · 2 评论 -
如何看待消息中间件的选型
前言近来有很多网友留言:公司要做消息中间件选型,该如何选?你哪个比较好?我的回答一般是:It’s a nice topic~ 如果随意回答一个的话显得很不严谨也不太负责任,如果严谨的回答的话一天就不用干活了。消息选型的确是一个大论题,实则说来话长的事情又如何长话短说。被问的越多越觉得需要整理一篇自己的观点出来,主要的目的将自己的经验分享出来,可以让别人少踩点误区,次要的目的是下次再被问到了可以...原创 2018-02-10 11:08:40 · 2579 阅读 · 2 评论