RocketMQ消息消费原理及实战
DefaultMQPushConsumer 核心参数与工作原理Push模型消息拉取机制 其核心关键点如下: 经过队列负载机制后,会分配给当前消费者一些队列,注意一个消费组可以订阅多个主题,正如上面 pullRequestQueue 中所示,topic_test、topic_test1 这两个主题都分配了一个队列。 轮流从 pullRequestQueue 中取出一个 PullRequest 对象,根据该对象中的拉取偏移量向 Broker 发起拉取请求,默认拉取 32 条,可通过上文中提到的 pullBatchSize 参数进行改变,该方法不仅会返回消息列表,还会返更改 PullRequest 对象中的下一次拉取的偏移量。 接收到 Broker 返回的消息后,会首先放入 ProccessQueue(处理队列),该队列的内部结构为 TreeMap,key 存放的是消息在消息消费队列(consumequeue)中的偏移量,而 value 为具体的消息对象。 然后将拉取到的消息提交到消费组内部的线程池,并立即返回,并将 PullRequest 对象放入到 pullRequestQueue 中 ...
JVM调优实战——解决内存占用高问题
JVM启动后一段时间内内存占用飙升如下,是我们一服务重启后运行快2天的内存占用情况,可以发现内存一直从45%涨到了62%,8G的容器,上涨内存大小为1.36G! 但我们这个服务其实没有内存泄露问题,因为JVM为堆申请的内存是虚拟内存,如4.8G,但在启动后JVM一开始可能实际只使用了3G内存,导致Linux实际只分配了3G。 然后在gc时,由于会复制存活对象到堆的空闲部分,如果正好复制到了以前未使用过的区域,就又会触发Linux进行内存分配,故一段时间内内存占用会越来越多,直到堆的所有区域都被touch到。 而通过添加JVM参数-XX:+AlwaysPreTouch,可以让JVM为堆申请虚拟内存后,立即把堆全部touch一遍,使得堆区域全都被分配物理内存,而由于Java进程主要活动在堆内,故后续内存就不会有很大变化了,我们另一服务添加了此参数,内存表现如下: 可以看到,内存上涨幅度不到2%,无此参数可以提高内存利用度,加此参数则会使应用运行得更稳定。 如我们之前一服务一周内会有1到2次GC耗时超过2s,当我添加此参数后,再未出现过此情况。这是因为当无此参数时,若GC访问到了未读写 ...
MAT排查案例——BeanCopy的正确使用方式
1 问题背景线上环境和测试环境均发现过应用卡死,频繁Full GC,原因是因为Metaspace空间(JVM参数为-XX:MaxMetaspaceSize为256m)不足导致OOM,一段时间后服务自动重启,重启后服务正常。因为有配置OOM dump文件生成记录,所以获取到了当时OOM dump文件。 项目频繁发生metaspace溢出,基于相关知识毫不犹豫的想到以下几点 项目中使用过多反射 项目中使用过多的动态代理技术 项目中使用过多的lambda 2 问题分析2.1 OOM dump文件分析从MAT Leak Suspects分析来看: 不存在占用内存大的对象。 整体看下来无明显异常情况。 2.2 结合资料分析Metaspace空间使用 Metaspace 空间通过 mmap 来从操作系统申请内存,申请的内存会分成一个一个 Metachunk,以 Metachunk 为单位将内存分配给类加载器,每个 Metachunk 对应唯一一个类加载器,一个类加载器可以有多个 Metachunk。 通过监控可以发现,Metaspace空间使用率为:87%。可能的原因是给类加载器分配的 ...
JVM内存分析工具MAT的使用方式
MAT工具简介MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具。其通过展现 JVM 异常时所记录的运行时堆转储快照(Heap dump)状态(正常运行时也可以做堆转储分析),帮助定位内存泄漏问题或优化大内存消耗逻辑。 一般来说,线上出现GC问题会有异常告警,此时应该做的是下线一个节点,导出dump文件保留事故现场,然后对线上服务做回滚/灰度处理,或者调整堆内存大小,或者重启服务器/手动触发FullGC快速回收内存,先保证服务正常运行,然后再用1天的时间对dump文件进行分析,排查出异常问题并进行修复。 基础概念Heap DumpHeap Dump 是 Java 进程堆内存在一个时间点的快照,其主要结构包含: 所有对象的实例信息:对象所属类名、基础类型和引用类型的属性等 所有类信息:类加载器、类名、继承关系、静态属性 GC Root:GC Root 代表通过可达性分析来判定 JVM 对象是否存活的起始集合。JVM 采用追踪式垃圾回收(Tracing GC)模式,从所有 GC Roots 出发通过引用 ...
使用arthas及插件故障排查实践
Arthas 简介Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到 JVM 的实时运行状态? 怎么快速定位应用的热点,生成火焰图? 怎样直接从 JVM 内查找某个类的实例? 常见的故障问题排查案例启动arthas一般线上已经部署了arthas,可以直接用该命令启动 12curl -O https://arthas.aliyun.com/arthas-boot.jarjava -ja ...
RocketMQ消息发送常见错误及解决方案
No route info of this topic通常情况下 No route info of this topic 这个错误一般是在刚搭建 RocketMQ、刚入门 RocketMQ 遇到的比较多。通常的排查思路如下。 可以通过 RocketMQ-Console 查询路由信息是否存在,或使用如下命令查询路由信息: 12cd ${ROCKETMQ_HOME}/binsh ./mqadmin topicRoute -n 127.0.0.1:9876 -t dw_test_0003 如果通过命令无法查询到路由信息,则查看 Broker 是否开启了自动创建 Topic,参数为 autoCreateTopicEnable,该参数默认为 true。但在生产环境不建议开启。 如果开启了自动创建路由信息,但还是抛出这个错误,这个时候请检查客户端(Producer)连接的 NameServer 地址是否与 Broker 中配置的 NameServer 地址是否一致。 经过上面的步骤,基本就能解决该错误。 消息发送超时RemotingTimeoutException:wai ...
初识netty及整合SpringBoot实践
初识NettyNetty 是一个 NIO 客户端服务器框架,可快速轻松地开发网络应用程序,例如协议服务器和客户端。有了Netty,你可以实现自己的HTTP服务器,FTP服务器,UDP服务器,RPC服务器,WebSocket服务器,Redis的Proxy服务器,MySQL的Proxy服务器等等。 Netty 的 I/O 模型是基于非阻塞 I/O 实现的,底层依赖的是 JDK NIO 框架的多路复用器 Selector。一个多路复用器 Selector 可以同时轮询多个 Channel,采用 epoll 模式后,只需要一个线程负责 Selector 的轮询,就可以接入成千上万的客户端。 Netty 所采用的主从 Reactor 多线程模型,所有的 I/O 事件都注册到一个 I/O 多路复用器上,当有 I/O 事件准备就绪后,I/O 多路复用器会将该 I/O 事件通过事件分发器分发到对应的事件处理器中。该线程模型避免了同步问题以及多线程切换带来的资源开销,真正做到高性能、低延迟。 NIO的特点: 一个线程可以处理多个 ...
验签二三事
验签方法一般来说,为了避免各个业务系统分别实现验签方法,导致系统间对接成本过高、代码冗余重复造轮,增加不必要的工作量,企业一般会统一验签规则。 APISIX 网关验签APISIX 是一个动态、实时、高性能的API网关,如果想设置对外暴露的接口地址转发至相应的k8s服务,可以在 APISIX 中配置路由,在插件配置步骤中可开启 hmac-auth 验签(此插件可自定义),并实现验签功能。 hmac-auth 验签插件支持自定义请求头及一系列的 filter 规则,支持统一的正确/错误响应体,也支持在 nacos 中读取限流配置信息。自定义好插件后,需要将插件启动,在容器中运行才可生效。 nacos 限流配置 验签密钥而只要开启了 APISIX 的 hmac-auth 验签,所有经过该路由的方法都需要用这个验签方法,怎么就能让业务系统接入这个验签规则呢?我们公司的 PAAS 系统就在创建应用的时候,为业务系统创建了相应的 APPKEY 和 secret,并且调用了APISIX的一个请求消费者的接口,将APPKEY 和 secret 推给了 APISIX,这才将业务系统的密钥传到 ...
RocketMQ的最佳实践
幂等性保证对于非幂等的请求,我们在业务里要做幂等性保证。 在消息队列中的幂等性体现消息队列中,很可能一条消息被冗余部署的多个消费者收到,对于非幂等的操作,比如用户的注册,就需要做幂等性保证,否则消息将会被重复消费。可以将情况概括为以下几种: 生产者重复发送:由于网络抖动,导致生产者没有收到broker的ack而再次重发消息,实际上broker收到了多条重复的消息,造成消息重复 消费者重复消费:由于网络抖动,消费者没有返回ack给broker,导致消费者重试消费。 rebalance时的重复消费:由于网络抖动,在rebalance重分配时也可能出现消费者重复消费某条消息。 如何保证幂等性消费 mysql插入业务id作为主键,主键是唯一的,所以一次只能插入一条 使用redis或zk的分布式锁(主流的方案) 添加业务性的判断,过滤掉已修改状态的数据 消息顺序消费为什么要保证消息有序比如有这么一个物联网的应用场景,IOT中的设备在初始化时需要按顺序接收这样的消息: 设置设备名称 设置设备的网络 重启设备使配置生效 如果这个顺序颠倒了,可能就没有办法让设备的配置生效,因为只有重启 ...
RocketMQ存储方式探究
简介首先,在RocketMQ管理页面手动创建一个Topic,配置如下图: 这里解释一下图中的几个参数: writeQueueNums:客户端在发送消息时,可以向多少个队列进行发送; readQueueNums:客户端在消费消息时,可以从多少个队列进行拉取; perm:当前 Topic 读写权限,2 只允许读、4 只允许写、6 允许读写,默认是 6。 RocketMQ 主要有 3 个消息相关的文件:commitlog、consumequeue 和 index。 writeQueueNums 参数控制 consumequeue 的文件数量。往 MyTestTopic 这个 Topic 发送了 100 条消息,这些消息保存在了 commitlog 文件。而 consumequeue 文件如下: 1234[root@xxx MyTestTopic]# pwd/root/store/consumequeue/MyTestTopic[root@xxx MyTestTopic]# ls0 1 2 3 4 5 6 7 可以看到,consumequeue 的保存是在 consumequ ...
一键解标功能需求分析
一键解标功能需求分析需求说明: 1.明月AI标讯平台导航栏新增菜单“招标解读” 2.用户上传招标文件(<150页,且<10万字),文件类型限制为(docx、doc、pdf),上传完成AI输出招标文件分析结果(关键指标),每条分析结果支持反向定位到原始依据页面 3.新增招标解读Agent,后端调用该Agent获取招标文件的分析结果 4.新增招标解读历史记录模块,支持用户查询自己历史解读的标讯结果 最终产品效果图: 表设计招标文件解析表1234567891011121314CREATE TABLE `func_bid_doc_analysis` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `file_name` varchar(255) DEFAULT NULL COMMENT '招标文件名称', `file_url` varchar(2000) DEFAULT '' COMMENT '招标文件url', `original_ ...
WebSocket的使用场景
简介HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。 优点: 支持双向通信,实时性更强。 更好的二进制支持。 较少的控制开销。连接创建后,ws客户端、服务端进行数据交换时,协议控制的数据包头部较小。在不包含头部的情况下,服务端到客户端的包头只有2~10字节(取决于数据包长度),客户端到服务端的的话,需要加上额外的4字节的掩码。而HTTP协议每次通信都需要携带完整的头部。 支持扩展。ws协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议。(比如支持自定义压缩算法等 使用场景websocket是前后端通过长连接通信的常用解决方案,相比于定时轮询的方式,突出的就是一个时效性,对于消息的接收和推送是实时的。 什么场景下会用到 websocket 呢? 站内信websocket 的双向通信能让我们迅速联想到实时聊天、点赞评论通知、站内信等等,那接下来就具体讲讲使用 websocket 实现站内信的设计思路。 分布式场景下,当服务端由于访问压力过高,启动两个服务的时候,那么客户端连接就会出现 sess ...
avatar
Palette
这是一个终身学习的时代
Follow Me
公告

欢迎来到「Palette」个人技术博客!🎉

本平台专注于:

  • > JAVA后端技术笔记
  • > 场景设计解决方案
  • > AI应用实践

🌟 一起钻研技术,共同进步!