![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
消息队列
文章平均质量分 81
JavaEdge.
关注并私信我,获取更多大厂求职经验。《编程严选网》创始人
展开
-
RocketMQ源码本地搭建调试
中间出一些问题,都能根据提示信息在源码中找到相应解决方案,多看源码,是成长捷径。原创 2023-01-26 20:05:42 · 1734 阅读 · 6 评论 -
单线程事件处理器ControllerEventManager
单线程事件处理器,Controller端定义的一个组件。该组件内置了一个专属线程,负责处理其他线程发送过来的Controller事件。还定义了一些管理方法,为专属线程输送待处理事件。0.11.0.0版本前,Controller组件源码复杂。集群元数据信息在程序中同时被多个线程访问,因此,源码里有大量Monitor锁、Lock锁或其他线程安全机制,导致晦涩难懂,改动困难0.11.0.0版本开始,社区重构Controller代码结构。将多线程并发访问改为单线程的事件队列方式。原创 2023-01-22 11:33:39 · 2981 阅读 · 3 评论 -
kafka单条消息过大导致线上OOM,运维连夜跑路了!
消费端的fetch.message.max.bytes指定最大消息需要的内存空间,同样,分区数最大需要内存空间不能超过服务器内存。查看kafka配置,默认单条消息最大1M,当单条消息长度超过1M,就会出现发送到broker失败,从而导致消息在producer的队列一直累积,直到Pro OOM。通过性能测试,kafka在消息为10K时吞吐量达到最大,更大消息降低吞吐量,在设计集群的容量时,尤其要考虑。且有1000个分区,则需近1G内存,确保分区数最大的消息不会超过服务器内存,否则OOM。原创 2022-12-19 21:45:48 · 4054 阅读 · 0 评论 -
为什么kafka延迟比rocketmq延迟高
数据存储结构是主要原因,还有就是kafka只支持pull模式。而rocketmq有pull、push两种模式 (虽然这个push模式是假push),push模式延迟肯定是比pull模式延迟低。说kafka延迟比rocketmq延迟高 是有一个前提的 就是topic较多的时候 这个和这2个MQ的数据存储结构有关系的 在topic少的时候延迟基本一致。所以在topic比较多时,分区文件数量会非常庞大 磁盘顺序读效率还不如随机读效率,则会在topic比较多时 磁盘顺序读就蜕变为随机读,延迟也就高了。原创 2022-11-19 21:35:02 · 707 阅读 · 1 评论 -
RocketMQ基于Netty长连接
NIO概念同步非阻塞,每个请求对应一个socketchannel通道数据通过bytebuffer来传输,所有的socketchannel注册到selector选择器上reactor线程池从轮询来处理请求调用select poll epoll函数来获取数据,获取后的数据交给worker线程池来进行参数验证和信息封装,业务线程再去读取数据进行写入,每个线程池负责不同的内容相互不影响来提升并发。原创 2022-10-19 23:53:53 · 951 阅读 · 0 评论 -
大厂都是如何处理重复消息的?
消息传递过程出现传递失败,发送方会执行重试,重试过程可能会产生重复消息。对使用消息队列的系统,如果没对重复消息处理,可能会导致系统数据错误。比如一个消费订单消息,统计下单金额的微服务。如果没正确处理重复消息,那就会出现重复统计,导致统计结果错误。如果消息队列本身能保证消息不重复,那应用程序实现不就简单了?那有没有消息队列能保证消息不重复呢?消息重复的情况必然存在。在MQTT协议,给出三种传递消息时能够提供的服务质量标准,服务质量从低到高:At most once: 至多一次。消息在传递时,原创 2022-09-03 15:00:15 · 2590 阅读 · 0 评论 -
消息的可靠性传输,如何处理消息丢失问题?
用MQ时,要注意消息数据:不能多,牵涉重复消费处理和幂等性问题不能少,消息不能搞丢呀若这是用MQ传递非常核心的消息,如计费系统,就是很重的业务,操作很耗时,设计上经常将计费做成异步化,就是用MQ。为确保MQ传递过程中不会弄丢计费消息。广告主投放个广告,说好用户点击一次扣1块。结果要是用户动不动点击了一次,扣费时搞的消息丢了,公司就会不断少几块。MQ丢数据,一般分两种:MQ自己弄丢了消费时弄丢了1.1 生产者丢数据生产者将数据发送到MQ时,因为网络等问题,数据在半路丢了。解决方案原创 2019-05-13 11:24:28 · 1233 阅读 · 4 评论 -
滴滴二面:Kafka是如何读写副本消息的?
无论是读取副本还是写入副本,都是通过底层的Partition对象完成的,而这些分区对象全部保存在上节课所学的allPartitions字段中。可以说,理解这些字段的用途,是后续我们探索副本管理器类功能的重要前提。现在,我们就来学习下副本读写功能。整个Kafka的同步机制,本质上就是副本读取+副本写入,搞懂了这两个功能,你就知道了Follower副本是如何同步Leader副本数据的。appendRecords-副本写入向副本底层日志写入消息的逻辑就实现在ReplicaManager#appendReco原创 2022-01-09 23:28:14 · 6417 阅读 · 11 评论 -
网易三面:说说Kafka的Follower是如何拉取Leader消息的?
搞懂AbstractFetcherThread的processPartitionData、truncate、buildFetch等方法,就掌握了拉取线程的处理逻辑。串联起这三个方法的doWork方法就能完整理解Follower副本应用拉取线程(即ReplicaFetcherThread线程),从Leader副本获取消息并处理的流程了。AbstractFetcherThread#doWorkdoWork,AbstractFetcherThread的核心方法,线程的主逻辑运行方法:AbstractFet原创 2022-01-08 00:01:43 · 2506 阅读 · 7 评论 -
美团二面:详细说说Kafka拉消息的过程?
AbstractFetcherThread:拉取消息的步骤副本机制是Kafka实现数据高可靠性的基础:同一个分区下的多个副本分散在不同的Broker机器上,它们保存相同的消息数据以实现高可靠性。那如何确保所有副本上的数据一致性呢?最常见方案当属Leader/Follower备份机制(Leader/Follower Replication)。Kafka分区的:某个副本会被指定为Leader,负责响应客户端的读、写请求其他副本自动成为Follower,被动同步Leader副本中的数据被动同步:F原创 2022-01-05 00:00:11 · 5742 阅读 · 15 评论 -
腾讯三面:说说Kafka的分区状态机的实现原理?
PartitionStateMachine分区状态转换实现1 我为何读这源码?PartitionStateMachine,分区状态机负责管理Kafka分区状态的转换,类似ReplicaStateMachine。很多面试官都爱问Leader选举策略。学完本文,你不但能说出4种Leader选举场景,还能总结出它们的共性。2 简介PartitionStateMachine:定义如startup、shutdown公共方法及处理分区状态转换入口方法handleStateChanges的签名ZkPart原创 2022-01-03 21:47:52 · 3322 阅读 · 12 评论 -
字节终面:说说Kakfa副本状态机的实现原理?
关注文末公众号,有惊喜福利!读这源码有何用?ReplicaStateMachine是内部组件,一般用户感觉不到存在,但搞懂它,对从根本定位一些数据不一致问题大有裨益。部署3-Broker(A、B和C)Kafka集群,版本2.0.0。在这3个Broker上创建一个单分区、双副本主题。若两个副本分别位于A、B,而Controller在C当关闭A、B后,zk会显示该主题的Leader是-1,ISR为空但若两个副本依处A、B,而Controller在B依次关闭A、B,该主题在zk中的Lea.原创 2022-01-02 22:20:16 · 3936 阅读 · 4 评论 -
阿里四面:kafka何时、如何删除Topic?
Topic是怎么被删除的?Kafka有很多状态机和管理器,如Controller通道管理器ControllerChannelManager、处理Controller事件的ControllerEventManager等。这些管理器和状态机,大多与各自“宿主”联系密切。就如Controller这俩管理器,必须与Controller组件紧耦合,才能实现各自功能。Kafka还有一些状态机和管理器,具有相对独立的功能框架,不严重依赖使用方,如:TopicDeletionManager(主题删除管理器)负责原创 2022-01-01 22:32:43 · 1639 阅读 · 8 评论 -
Kafka Server Reactor设计模型
Acceptor监听客户端的连接请求,并建立和客户端的数据传输通道,然后为这个客户端指定一个Processor,它的工作就到此结束,这样它就可以去响应下一个客户端的连接请求了。Processor主要职责是负责从客户端读取数据和将响应返回给客户端,它本身不处理具体的业务逻辑,每个Processor都有一个Selector,用来监听多个客户端,因此可以非阻塞地处理多个客户端的读写请求,Processor将数据放入RequestChannel的RequestQueue中和从ResponseQueue读取..原创 2020-12-03 22:34:40 · 1242 阅读 · 0 评论 -
Kafka源码解析之SocketServer
为何要划分优先级Kafka处理请求不区分优先级,但这种绝对公平的策略有时会发生问题。比如:创建一个单分区双副本的主题,当时集群中的Broker A机器保存了分区的Leader副本,Broker B保存了Follower副本。突然业务激增,Broker A瞬间积压大量未处理PRODUCE请求。运维“不凑巧”执行了次Preferred Leader选举,将Broker B显式地调整成了Leader。若Producer把acks设为all,那在LeaderAndIsr请求(负责调整副本角色,比如Follow原创 2021-05-30 19:59:35 · 1296 阅读 · 2 评论 -
Kafka竟然也用二分搜索算法查找索引!
索引应用二分查找算法快速定位索引项。难得的是,Kafka的索引组件中应用了二分查找算法,而且社区还针对Kafka自身的特点对其进行了改良。索引类图及源文件组织架构都位于core包的/src/main/scala/kafka/logAbstractIndex.scala定义了最顶层的抽象类,这个类封装了所有索引类型的公共操作。LazyIndex.scala定义了AbstractIndex上的一个包装类,实现索引项延迟加载。这个类主要是为了提高性能,并无功能上的改进OffsetIndex.s原创 2020-12-01 19:14:33 · 1295 阅读 · 0 评论 -
Kafka Partition Leader选举机制原理详解
1 大数据常用的选主机制Leader选举算法非常多,大数据领域常用的有以下两种:1.1 Zab(zookeeper使用)Zab协议有四个阶段Leader electionDiscovery (E#epoch establish)Synchronization (5X#sync with followers)Broadcast比如3个节点选举leader:编号为1、2、3。 1先启动,选择自己为leader,然后2启动首先也选择自己为leader,由于1,2都没过半,选择编号大的为lea原创 2020-12-03 23:49:18 · 3702 阅读 · 9 评论 -
Kafka请求队列源码实现-RequestChannel请求通道
Kafka如何实现请求队列核心类Kafka服务端,即Broker,负责消息的持久化,是个不断接收外部请求、处理请求,然后发送处理结果的Java进程。Broker的高处理性能在于高效保存排队中的请求。Broker底层请求对象的建模请求队列的实现原理Broker请求处理方面的核心监控指标。Broker与Clients主要基于Request/Response机制交互,所以看看如何建模或定义Request和Response。请求(Request)RequestChannel#Request原创 2020-12-05 19:53:10 · 1524 阅读 · 0 评论 -
Kafka 高性能的原因
顺序写,Page Cache 空中接力,高效读写0 拷贝后台异步、主动Flush预读策略,IO调度原创 2020-07-19 23:34:27 · 2056 阅读 · 1 评论 -
Kafka消费过程关键源码解析
Kafka消费模型的几个要点:Kafka的每个Consumer(消费者)实例属于一个ConsumerGroup(消费组);在消费时,ConsumerGroup中的每个Consumer独占一个或多个Partition(分区);对于每个ConsumerGroup,在任意时刻,每个Partition至多有1个Consumer在消费;每个ConsumerGroup都有一个Coordinator(协调者)负责分配Consumer和Partition的对应关系,当Partition或是Consumer发生变更原创 2020-09-13 00:21:16 · 1619 阅读 · 0 评论 -
Kafka实战(五) - Kafka的秘技"坂本"之争
只有顺应版本,才能成就王者不败神话也是能否用好Kafka的关键。不论是哪种Kafka,本质上都基于core Apache Kafka那就来说说Apache Kafka版本号的问题1 缘何"在乎"你这版本号直接使用最新版本不就好了吗?当然了!这的确是一种有效策略,这种策略并非在任何场景下都适用如果不了解各个版本之间的差异和功能变化,怎么能够准确地评判某Kafka版本是不是满足你的业务...原创 2019-08-28 23:52:44 · 1582 阅读 · 0 评论 -
Kafka实战(六) - 核心API及适用场景全面解析
1 四个核心API● Producer API允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。● Consumer API允许一个应用程序订阅一个或多个topic ,并且对发布给他们的流式数据进行处理。● Streams API允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进...原创 2019-11-14 00:56:48 · 2722 阅读 · 0 评论 -
Kafka生产者消息发布模式源码解析
1 同步发送模式源码2 异步发送模式源码流程3 总结3.1 同步发送模式特点同步的向服务器发送RPC请求进行生产发送错误可以重试可以向客户端发送ack3.2 异步发送模式特点最终也是通过向服务器发送RPC请求完成的(和同步发送模式一样)异步发送模式先将一定量消息放入队列中,待达到一-定数量后再一起发送;异步发送模式不支持发送ack,但是Client可以调用回调函数获取发送结果所以,性能比较高的场景使用异步发送,准确性要求高的场景使用同步发送。...原创 2020-12-03 19:57:52 · 1183 阅读 · 0 评论 -
Kafka实战(2)-Kafka消息队列模型核心概念
Kafka属于分布式的消息引擎系统,提供一套完备的消息发布与订阅解决方案在Kafka中,发布订阅的对象是主题(Topic),可为每个业务、每个应用甚至是每类数据都创建专属的主题。1 Producer & Consumer向主题发布消息的客户端应用程序称为生产者(Producer),生产者程序通常持续不断地向一个或多个主题发送消息,而订阅这些主题消息的客户端应用程序就被称为消费者...原创 2019-08-24 02:02:57 · 2405 阅读 · 0 评论 -
Kafka实战(四) -Kafka门派知多少
Kafka不是一个单纯的消息引擎系统,而是能够实现精确一次(Exactly-once)处理语义的实时流处理平台Storm/Spark Streaming/Flink,在大规模流处理领域主流Kafka经过这么长时间不断的迭代,现在已经能够稍稍比肩这些框架Kafka社区对于这些框架心存敬意目前国内鲜有大厂将Kafka用于流处理的尴尬境地,毕竟Kafka是从消息引擎“半路出家”转型成流处理平台...原创 2019-08-26 02:35:17 · 2264 阅读 · 0 评论 -
Kafka Producer拦截器(Interceptor)
Kafka拦截器一共有两种:Producer端Consumer端本篇主要讲述的是Kafka Producer端的拦截器,它主要用来对消息进行拦截或者修改,也可以用于Producer的Callback回调之前进行相应的预处理。使用Kafka Producer端的拦截器非常简单,主要是实现ProducerInterceptor接口,此接口包含4个方法:ProducerRecord<K, V> onSend(ProducerRecord<K, V> record)Pro原创 2021-07-08 21:09:49 · 1139 阅读 · 0 评论 -
ZooKeeper到底为Kafka的做了什么牺牲?
Kafka使用zk实现和RocketMQ的NameServer相似的功能。1 Kafka的zk有什么作用?首先我们来看一下Kafka在ZooKeeper都保存了哪些信息:0.8.x的旧版本的情况,最新版本的Kafka已经将消费位置管理等一些原本依赖ZooKeeper实现的功能,替换成了其他的实现方式。绿色框形是临时节点,其它是持久节点。1.1 ids 子树(临时节点)保存的是Kafka的Broker信息,/brokers/ids/[0…N],每个临时节点对应一个在线Broker,Broker原创 2020-09-15 05:46:46 · 1261 阅读 · 0 评论 -
Kafka的位移索引和时间戳索引
在Kafka的数据路径下有很多.index和.timeindex后缀文件:.index文件,即Kafka中的位移索引文件.timeindex文件,即时间戳索引文件。1 OffsetIndex - 位移索引索引中的索引项是如何定义的?如何向索引写入新的索引项?1.1 定义每当Consumer需要从topic分区的某位置开始读消息时,Kafka就会用OffsetIndex直接定位物理文件位置,避免从头读取消息的I/O性能开销。不同索引类型保存不同的 K.V 对。OffsetIndex的K原创 2020-12-01 20:50:02 · 3293 阅读 · 0 评论 -
Kafka是如何应用NIO实现网络通信的?
搞懂“Kafka究竟是怎么应用NIO来实现网络通信的”,不仅是我们掌握Kafka请求全流程处理的前提条件,对我们了解Reactor模式的实现大有裨益当Broker处理速度很慢、需要优化,只有明确知道SocketServer组件的工作原理,才能制定出恰当的解决方案,并有针对性地给出对应的调优参数。网络通信层在深入学习Kafka各个网络组件之前,我们先从整体上看一下完整的网络通信层架构,如下图所示:Kafka网络通信组件主要由两大部分构成SocketServerKafkaRequestHandl原创 2021-01-01 18:14:21 · 1226 阅读 · 0 评论 -
Kafka分区、组消费模式源码解析
1 分区消费模式直接由客户端(任一语言编写)使用Kafka提供的协议向服务器发送RPC请求获取数据,服务器接受到客户端的RPC请求后,将数据构造成RPC响应,返回给客户端,客户端解析相应的RPC响应获取数据。Kafka支持的协议众多,使用比较重要的有:获取消息的FetchRequest和FetchResponse获取offset的OffsetRequest和OffsetResponse提交offset的OffsetCommitRequest和OffsetCommitResponse获取Met原创 2020-12-03 17:07:49 · 1236 阅读 · 0 评论 -
Kafka源码解析之日志段类LogSegment
目标源码日志(Log)、日志段(LogSegment)以及索引(Index)。探究Kafka中的消息是如何被保存和组织在一起的?Kafka底层日志文件00000000000000012345.log的类似命名?Kafka日志结构概览Kafka日志在磁盘上的组织架构Kafka日志对象由多个日志段对象组成每个日志段对象会在磁盘上创建一组文件,包括消息日志文件(.log)位移索引文件(.index)时间戳索引文件(.timeindex)已中止(Aborted)事务的索引文件(.tx原创 2020-09-21 05:10:29 · 1220 阅读 · 0 评论 -
Kafka实战(7)-究竟该如何部署Kafka集群?
部署Kafka环境,一开始就要思考好实际场景下业务所需的集群环境,不能仅从单个维度上进行评估。参考Linux内核模型架构Kafka核心技术与实战。原创 2019-12-20 02:27:35 · 2551 阅读 · 0 评论 -
Kafka实战(3)-Kafka的自我定位
Apache Kafka是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform)Kafka是LinkedIn公司内部孵化的项目。LinkedIn最开始有强烈的数据强实时处理方面的需求,其内部的诸多子系统要执行多种类型的数据处理与分析,主要包括业务系统和应用程序性能监控,以及用户行为数据处理等。遇到的主要问题:数据正确性不足数据的收集主要...原创 2019-11-13 00:30:21 · 36206 阅读 · 2 评论 -
Kafka实战(01)-为何大厂都选择Kafka作为消息队列
开源的消息引擎系统“消息队列”“消息中间件”的提法想必你一定是有所耳闻的。不过说实话我更愿意使用消息引擎系统这个称谓,因为消息队列给出了一个很不明确的暗示,仿佛Kafka是利用队列的方式构建的;而消息中间件的提法有过度夸张“中间件”之嫌,让人搞不清楚这个中间件到底是做什么的。像Kafka这一类的系统国外有专属的名字叫Messaging System,国内很多文献将其简单翻译成消息系统。我个...原创 2019-08-24 01:49:19 · 2242 阅读 · 1 评论 -
RocketMQ实战(3)-消息的有序性
■ RocketMQ有序消息的使用1 为什么需要消息的有序性比如用户张三终于挣了一百存在在银行卡里存取款,对应两个异步的短信消息,肯定要保证先存后取吧,不然都没钱怎么发了取钱的消息呢!M1 - 存钱M2 - 取钱而mq默认发消息到不同q显然是行不通的,会乱序需要发往同一个q,先进先出2 有序消息的基本概念有序消息又叫顺序消息(FIFO 消息)是指消息的消费顺序和产生顺序相同,在...原创 2019-11-10 21:40:01 · 2478 阅读 · 0 评论 -
RocketMQ 实战(五) - 批量消息和事务消息
1 批量消息1.1 为什么使用批量消息在很多调优的时候,比如数据库批量处理,有些请求进行合并发送等都是类似批量的实现RocketMQ批量发送也是为了追求性能,特别在消息数量特别大的时候,批量效果就非常明显1.2 使用批量消息的限制同一批次的消息应该具有相同主题、相同的消息配置不支持延迟消息建议一个批量消息大小最好不要超过1MB2 事务消息2.1 什么是事务消息Rocke...原创 2019-11-11 00:46:10 · 2308 阅读 · 0 评论 -
RocketMQ 实战(六) - 最佳实践
1 Producer一个应用尽可能用一个Topic,消息子类型用tags来标识,tags可以由应用自由设置只有发送消息设置了tags,消费方在订阅消息时,才可以利用tags在broker做消息过滤message.setTags("TagA"); 如有可靠性需要,消息发送成功或者失败,要打印消息日志(sendresult和key信 息)如果相同性质的消息量大,使用批量消息...原创 2019-11-11 02:23:57 · 2319 阅读 · 0 评论 -
RocketMQ实战(二)-架构
1 RocketMQ角色介绍RocketMQ由四个角色组成Producer: 消息生产者Consumer:消费者Broker: MQ服务,负责接收、分发消息NameServer:负责MQ服务之间的协调2 RocketMQ架构方案NameServer提供轻量级服务发现和路由。每个名称服务器记录完整的路由信息,提供相应的读写服务,并支持快速存储扩展。设置小点设置小点...原创 2019-11-03 18:27:48 · 1711 阅读 · 0 评论 -
PushConsumer核心参数详解
1 consumeFromWhere消费者从那个位置开始消费。CONSUME_FROM_LAST_OFFSET第一次启动从队列最后位置消费,后续再启动接着上次消费的进度开始消费CONSUME_FROM_FIRST_OFFSET第一次启动从队列初始位置消费,后续再启动接着上次消费的进度开始消费CONSUME_FROM_TIMESTAMP第一次启动从指定时间点位置消费,后续再启动接着上次消费的进度开始消费2 allocateMessageQueueStrategy默认AllocateM原创 2020-10-08 02:46:54 · 2256 阅读 · 0 评论 -
RocketMQ实战(一) - 简介
1 RocketMQ是什么RocketMQ是由阿里捐赠给Apache的一款分布式、队列模型的开源消息中间件,经历了淘宝双十一的洗礼。官网2 RocketMQ的发展史2017开始发布即最新4.0.0版本3 RocketMQ的特性4 RocketMQ基本概念Client端Producer Group一类Producer的集合名称,这类Producer通常发送一类消...原创 2019-10-24 13:39:30 · 2825 阅读 · 1 评论