自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(870)
  • 收藏
  • 关注

原创 Kafka面试八股文(21问+答案解析)

消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

2025-11-19 21:55:03 880

原创 手绘4 张图带你入门 RPC 服务框架

RPC 的英文全称是:Remote Procedure Call,中文常见翻译:远程过程调用。「过程」这个词着实让人费解,也不知道最开始是谁翻译过来的,个人觉得应该翻译成:程序、方法、服务,这几个都比「过程」要好。远程服务调用。这里的「服务」是指程序接口、方法这一类资源。那到底什么是 RPC 呢?。没看懂?。听懂了一些,好像又没完全懂,那说人话吧。比如说有两台服务器:A 和 B,一个应用部署在 A 服务器上,想要调用 B 服务器上某个应用提供的函数/方法,

2025-11-19 21:52:12 770

原创 面试必备:虾皮服务端15连问!

虚拟内存,是虚拟出来的内存,它的核心思想就是确保每个程序拥有自己的地址空间,地址空间被分成多个块,每一块都有连续的地址空间。同时物理空间也分成多个块,块大小和虚拟地址空间的块大小一致,操作系统会自动将虚拟地址空间映射到物理地址空间,程序只需关注虚拟内存,请求的也是虚拟内存,真正使用却是物理内存。

2025-11-19 21:51:30 536

原创 拒绝宕机!万字详解分布式限流方案

限流是一种对请求或并发数进行限制的关键技术手段,旨在保障系统的正常运行。当服务资源有限、处理能力有限时,限流可以对调用服务的上游请求进行限制,以防止自身服务因资源耗尽而停止服务。指在单位时间内允许的请求量。例如,将 QPS(每秒请求数)限制为500,表示在1秒内最多接受500次请求。通过设置合适的阈值,可以控制系统的负载,避免过多的请求导致系统崩溃或性能下降。用于处理超过阈值的请求的策略。常见的拒绝策略包括直接拒绝、排队等待等。

2025-11-12 21:46:26 733

原创 RocketMQ为什么这么快?我从源码中扒出了10大原因!

在传统IO中,如果想将用户缓存区的数据放到内核缓冲区,需要经过CPU拷贝而基于零拷贝技术可以减少CPU拷贝次数,常见的有两种:mmap()sendfile()mmap()是将用户缓冲区和内核缓冲区共享,操作用户缓冲区就好像直接操作内核缓冲区,读写数据时不需要CPU拷贝Java中可以使用MappedByteBuffer这个API来达到操作内核缓冲区的效果sendfile()主要是用于文件传输,可以通过sendfile()将一个文件内容传输到另一个文件中或者是网络中。

2025-11-12 21:44:15 684

原创 订单超时自动取消该怎么设计?

定时任务和延迟消息。1、定时任务定时任务实现策略,我们可以简单划分为单机版和集群版。笔者并不认可单机版,背八股文当然可以,订单自动取消这个业务场景,生产环境还是要慎重。每种方式各有优缺点,笔者更倾向于任务调度平台 XXL-JOB 这种方式。2、延迟消息延时消息是一种非常优雅的模式。消息队列 RocketMQ自研延迟服务Redis 延迟队列。假如技术团队基础架构能力很强,笔者推荐使用 RocketMQ 或者自研延迟服务。

2025-11-12 21:38:25 781

原创 2025最新版Java面试题总结(多线程与高并发-50问)

OverrideSystem.out.println("关注公众号:捡田螺的小男孩");@OverrideSystem.out.println("关注公众号:捡田螺的小男孩");//运行结果:关注公众号:捡田螺的小男孩如果想要执行的线程有返回,可以使用Callable。@Overridereturn "关注公众号:捡田螺的小男孩";//运行结果:关注公众号:捡田螺的小男孩。

2025-11-12 21:16:32 748

原创 2025最新版Java面试题总结(RocketMQ-23问)

类比一下我们生活的邮政系统——邮政系统要正常运行,离不开下面这四个角色, 一是发信者,二 是收信者, 三是负责暂存传输的邮局, 四是负责协调各个地方邮局的管理机构。对应到 RocketMQ 中,这四个角色就是 Producer、 Consumer、 Broker 、NameServer。RocketMQ类比邮政体系在操作系统中,使用传统的方式,数据需要经历几次拷贝,还要经历用户态/内核态切换。传统文件传输示意图-来源《图解操作系统》从磁盘复制数据到内核态内存;从内核态内存复制到用户态内存;

2025-11-12 21:14:26 599

原创 万字聊一聊RocketMQ一条消息短暂而又精彩的一生!

为了更好地理解本文,这里再来总结一下RokcetMQ消息一生的各个环节。

2025-11-10 21:59:15 345

原创 缓存和数据库一致性问题,看这篇就够了

好了,总结一下这篇文章的重点。1、想要提高应用的性能,可以引入「缓存」来解决2、引入缓存后,需要考虑缓存和数据库一致性问题,可选的方案有:「更新数据库 + 更新缓存」、「更新数据库 + 删除缓存」3、更新数据库 + 更新缓存方案,在「并发」场景下无法保证缓存和数据一致性,且存在「缓存资源浪费」和「机器性能浪费」的情况发生。

2025-11-10 21:58:17 284

原创 熔断、隔离、重试、降级、超时、限流,高可用架构流量治理核心策略全掌握

一、可用性的定义在探讨高可用架构之前,让我们以 O2 系统为例,解释一下何谓可用性。O2 是腾讯内部的一个广告投放系统,专注于提升投放效率、分析广告效果,拥有自动化广告投放、AIGC 自动化素材生产等多种功能。其整体架构概览如下:一个完善的架构应该具备3个能力,也就是身体的“三高”:高性能;高可用;易扩展。理解高可用时,通常参考两个关键指标:平均故障间隔(Mean Time Between Failure,简称 MTBF):表示两次故障的间隔时间,也就是系统正常运行的平均时间,这个时间越长,说明系统的稳定性

2025-11-10 21:57:21 333

转载 探秘Dubbo一次RPC调用的核心流程!

到这终于讲完了一次RPC请求在Dubbo中经历整个核心流程不知道你看完有什么感受这里我再来画一张图总结整个调用过程值得注意是,上面提到的所有调用环节,注意说的是所有,Dubbo都留了对应的扩展点也就是说,小到一个Filter,大到整个通信协议你都可以进行自定义扩展从这也可以看出,Dubbo在设计上的优秀之处。

2025-11-10 21:56:10 363

原创 2025最新版Java面试题总结(MySQL篇-66问)

内连接(inner join):取得两张表中满足存在连接匹配关系的记录。外连接(outer join):不只取得两张表中满足存在连接匹配关系的记录,还包括某张表(或两张表)中不满足匹配关系的记录。交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,它是笛卡尔积在SQL中的实现,如果A表有m行,B表有n行,那么A和B交叉连接的结果就有m*n行。

2025-11-10 21:51:26 997

原创 探秘Kafka架构设计、消息可靠、数据持久、高性能背后的底层原理!

说到这里,我们头脑中或多或少会蹦出和等字样,是的,这就是 Kafka 最重要的落地场景。同步调用转换成异步消息通知,实现生产者和消费者的解耦。想象一个场景,在商品交易时,在订单创建完成之后,需要触发一系列其他的操作,比如进行用户订单数据的统计、给用户发送短信、给用户发送邮件等等。如果所有操作都采用同步方式实现,将严重影响系统性能。针对此场景,我们可以利用消息中间件解耦订单创建操作和其他后续行为。利用 broker 缓冲上游生产者瞬时突发的流量,使消费者消费流量整体平滑。

2025-11-10 21:48:02 399

原创 线程池遇到父子任务,有大坑,要注意!

最近在使用线程池的时候踩了一个坑,给你分享一下。在实际业务场景下,涉及到业务代码和不同的微服务,导致问题有点难以定位,但是最终分析出原因之后,发现可以用一个很简单的例子来演示。所以这次先用 Demo 说问题,再说场景,方便吸收。

2025-11-10 21:46:51 228

原创 Java中9种常见的CMS GC问题分析与解决!

本文主要针对 Hotspot VM 中“CMS + ParNew”组合的一些使用场景进行总结。重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省略较多。另外,本文专业术语较多,有一定的阅读门槛,如未介绍清楚,还请自行查阅相关材料。

2025-11-10 21:45:37 766

原创 为什么有HTTP协议,还要有websocket协议?

TCP协议本身是全双工的,但我们最常用的HTTP1.1,虽然是基于TCP的协议,但它是半双工的,对于大部分需要服务器主动推送数据到客户端的场景,都不太友好,因此我们需要使用支持全双工的websocket协议。在HTTP1.1里。只要客户端不问,服务端就不答。基于这样的特点,对于登录页面这样的简单场景,可以使用定时轮询或者长轮询的方式实现服务器推送(comet)的效果。对于客户端和服务端之间需要频繁交互的复杂场景,比如网页游戏,都可以考虑使用websocket协议。

2025-11-10 21:43:34 854

原创 聊一聊服务端开发必备的9大性能优化秘技!

本文主要总结进行服务性能优化的几种方式,每一种方式在我们常用的中间件中都有所体现,我想这也是我们常说多学习这些中间件的意义,学习它们不仅仅是学会如何去使用它们,也是学习它们底层优秀的设计思想,理解为什么要这样设计,这种设计有什么好处,后续我们在架构选型或者做服务性能优化时都会有一定的帮助。此外性能优化方式也给出了具体的落地实践。希望通过实际的应用例子加强对这种优化方式的理解。此外要做服务性能优化,还是要从自身服务架构出发,分析服务调用链耗时分布跟 CPU 消耗,优化有问题的 RPC 调用和函数。

2025-11-10 21:42:36 639

原创 Java面试官:说说分布式事务原理?

Seata 的 AT 模式建立在关系型数据库的本地事务特性的基础之上,通过数据源代理类拦截并解析数据库执行的 SQL,记录自定义的回滚日志,如需回滚,则重放这些自定义的回滚日志即可。AT 模式虽然是根据 XA 事务模型(2PC)演进而来的,但是 AT 打破了 XA 协议的阻塞性制约,在一致性和性能上取得了平衡。AT 模式是基于 XA 事务模型演进而来的,它的整体机制也是一个改进版本的两阶段提交协议。

2025-11-09 21:39:12 847

原创 java nio,netty,kafka 中经常提到“零拷贝”到底是什么?

无论是传统 I/O 拷贝方式还是引入零拷贝的方式,2 次 DMA 拷贝是都少不了的,因为两次 DMA 都是依赖硬件完成的。拷贝方式CPU拷贝DMA拷贝系统调用上下文切换传统方式(read + write)224内存映射(mmap + write)124sendfile12sendfile202sendfile2RocketMQ 选择了 mmap + write 这种零拷贝方式,适用于业务级消息这种小块文件的数据持久化和传输;

2025-11-09 21:37:26 841

原创 2025最新版Java面试题总结(Spring篇-35问)

Java 是面向对象的编程语言,一个个实例对象相互合作组成了业务逻辑,原来,我们都是在代码里创建对象和对象的依赖。所谓的IOC(控制反转):就是由容器来负责控制对象的生命周期和对象间的关系。以前是我们想要什么,就自己创建什么,现在是我们需要什么,容器就给我们送来什么。引入IOC之前和引入IOC之后也就是说,控制对象生命周期的不再是引用它的对象,而是容器。对具体对象,以前是它控制其它对象,现在所有对象都被容器控制,所以这就叫控制反转。控制反转示意图DI(依赖注入)

2025-11-09 21:36:08 608

原创 从源码层面剖析两条SQL之间的死锁原因!

在事务A执行回收单号为376473627618443479对应的数据修改时,会先处理单号376473601396703447对应的数据(通过SQL语句打印得知执行顺序),所以是如下执行流程。于是编写本地测试用例,同时启动两个线程模仿修改表的任务,发现确实会死锁,并且这次的死锁现象更奇怪,仅仅A线程和B线程各执行了一条SQL就产生了死锁,并且持有锁和等待锁都是。通过上述的问题验证,发现根本无法复现问题,因为事务A一定会阻塞事务B,但是为什么又会出现死锁的问题呢?现象是事务A会把事务B进行阻塞,并不会死锁。

2025-11-09 21:33:19 818

原创 1.5万字探秘Druid连接池的内部原理!

一个正常的SQL执行流程为:操作rs读取数据;关闭rs、stmt、conn。try{//调用Class.forName()方法加载驱动程序//创建连接//创建Statement对象//要执行的SQL//创建数据对象System.out.println("编号"+"\t"+"姓名"+"\t"+"年龄");rs.close();但如果每次请求都要新建连接和关闭连接,操作较重,费时费力,也影响了业务请求。其实Connection对象是可以重复利用的(只要保证。

2025-11-09 21:32:40 944

原创 Tomcat 架构原理解析到架构设计借鉴!

通过前面对 Tomcat 整体架构的学习,知道了 Tomcat 有哪些核心组件,组件之间的关系。以及 Tomcat 是怎么处理一个 HTTP 请求的。下面我们通过一张简化的类图来回顾一下,从图上你可以看到各种组件的层次关系,图中的虚线表示一个请求在 Tomcat 中流转的过程。Tomcat 整体组件关系。

2025-11-09 21:31:42 912

原创 日常工作,MQ的8种常用使用场景

我们日常开发中,经常跟MQ(消息队列)打交道。本文田螺哥梳理了MQ的8种使用场景。

2025-11-07 22:00:21 973

原创 Redis批量查询的四种技巧,应对高并发场景的利器!

简单直接,适用于批量获取字符串值的场景。适用于批量获取哈希表中的字段值,可以在一个命令中获取多个字段。最小化网络开销,一次性发送多个不同的命令,管道中的命令按照执行顺序依次执行,减少往返时间。高并发场景下,可以显著提高性能。使用 Lua 脚本的好处 :减少网络开销。将多个请求通过脚本的形式一次发送,减少网络时延。原子操作。Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。复用。客户端发送的脚本会永久存在 Redis 中,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。

2025-11-07 21:59:39 429

原创 RocketMQ 是什么?它的架构是怎么样的?和 Kafka 又有什么区别?

这次我们要加的中间层是消息队列。

2025-11-07 21:58:49 553

原创 1.6w字图解Java并发:多线程挑战、线程状态和通信、死锁AQS、ReentrantLock、Condition 使用和原理!

两个或两个以上的线程持有不同系统资源的锁,线程彼此都等待获取对方的锁来完成自己的任务,但是没有让出自己持有的锁,线程就会无休止等待下去。线程竞争的资源可以是:锁、网络连接、通知事件,磁盘、带宽,以及一切可以被称作“资源”的东西。如上图所示,Thread-1持有资源Object1但是需要资源Object2完成自身任务,同样的,Thread-2持有资源Object2但需要Object1,双方都在等待对方手中的资源但都不释放自己手中的资源,从而进入死锁。

2025-11-07 21:57:59 904

原创 Java面试整理(带答案):消息队列的十连问,经典永不过期!

你可以把消息队列理解为一个使用队列来通信的组件。它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。最简单的消息队列模型如下:我们通常说的消息队列,简称,它其实就指消息中间件。

2025-11-07 21:56:34 731

原创 Redis 是单线程模型?

因此,若要配置开启多线程IO,需要设置 io-threads 大于1,但不可以超过最大值128。设置io_threads_op = IO_THREADS_OP_READ,并且将io_threads_pending数组中各个位置值设置为对应各个IO线程分配到的客户端数量,如上面介绍,目的是为了使IO线程工作。如果IO线程等待处理任务数量为0,并且未获取到mutex锁,则会等待获取锁,暂停运行,由于主线程在创建IO线程之前先获取了锁,因此IO线程刚启动时是暂停运行状态,需要等待主线程释放锁,启动IO线程。

2025-11-07 21:44:16 802

原创 腾讯技术面:一条Redis命令是如何执行的?

注意,本次执行 readQueryFromClient 前,client 状态已被设置为 「CLIENT_PENDING_READ」 ,所以执行时,client 不会再次加入任务队列,而是进入真正的执行流程。若启用,则主线程将该连接客户端加入「clients_pending_read」读就绪队列,并将客户端 flag 标记为「CLIENT_PENDING_READ」,表示可读。解析客户端命令,执行对应操作逻辑(如 GET/SET/HSET),支持丰富的数据结构(String、Hash、List 等)。

2025-11-06 21:56:06 785

原创 注意了!mybatis中<if>条件判断,遇到带数字单字符有坑!

当mybatis判断条件<if>与单字符数字比较,会判断错误。大家是否踩过这个坑?

2025-11-05 21:56:08 169

原创 Feign如何设置超时时间,不同情况下还真不一样!

今天给大家扒了扒在不同使用条件下Feign的超时时间设置,总结起来大致如下:单独使用Feign时:通过和方法参数SpringCloud环境下单独使用Feign:方法参数、配置文件、声明OptionsBean跟Ribbon配合使用:通过Ribbon的超时参数设置跟Hystrix配合使用:修改默认的超时时间,尽量符合 Hystrix超时时间 >= (连接超时时间 + 读超时时间) * 重试次数。

2025-11-05 21:54:59 596

原创 SpringBoot接口防抖(防重复提交)的一些实现方案!

设置额外选项:过期时间和SET_IF_ABSENT选项”,有些同学可能不太清楚SET_IF_ABSENT是个啥,这里我解释一下:SET_IF_ABSENT是 RedisStringCommands.SetOption 枚举类中的一个选项,用于在执行 SET 命令时设置键值对的时候,如果键不存在则进行设置,如果键已经存在,则不进行设置。从测试的结果上看,防抖是做到了,但是随着缓存消失、锁失效,还是可以发起同样的请求,所以要真正做到接口幂等性,还需要业务代码的判断、设置数据库表的UK索引等操作。

2025-11-05 21:54:09 584

原创 33 张图详解 TCP 和 UDP :打通网络和应用的中间人!

先来一张,3 秒快速了解整篇文章的内容。

2025-11-05 21:53:11 613

原创 为什么说 Zookeeper 不适合做服务注册中心?

综上所述,尽管Zookeeper是一个强大且成熟的分布式协调服务,但它并不是为了做服务注册中心而设计的。在选择服务注册中心时,需要考虑到具体的需求和场景,并选择最适合的解决方案。对于大规模、高性能的服务注册中心场景,可以考虑使用其他专门为服务注册中心设计的工具,如Nacos,而不是基于Zookeeper进行额外的配置和开发。这样可以提高系统的稳定性、性能和开发效率,从而更好地支持微服务架构的发展。

2025-11-05 21:52:32 564

原创 吊打Java面试官,最常见的 SpringCloud 微服务面试题(收藏)

和包括哪些组件Nacos是CP还是AP?Nacos作为注册中心应该选择是CP还是AP?Nacos如何实现就近访问?Nacos底层负载均衡底层原理Nacos1.x注册中心架构流程Nacos2.X作为注册中心架构流程Nacos中的Distro协议Eureka注册中心原理Eureka自我保护机制原理Eureka和Nacos对比Nacos配置中心长轮询机制引用Nacos配置的定时任务失效(Nacos工作中遇到问题)Nacos加载那些配置,这些配置的优先级?

2025-11-05 21:45:44 609

原创 经典Java面试题:Redis 持久化有哪几种方式,怎么选?

今天给大家分享一道经典面试题:Redis 持久化有哪几种方式,怎么选?AOF持久化RDB持久化AOF和RDB如何选择。

2025-11-05 21:43:28 616

原创 这些年背过的Java面试题——SpringCloud篇

当服务A健康实例数/总实例数 < 保护阈值 的时候,说明健康实例真的不多了,这个时候保护阈值会被触发(状态true),nacos将会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,请求失败,但这样也⽐造成雪崩要好,牺牲了⼀些请求,保证了整个系统的⼀个可⽤。中的,也就是内存中。网关是所有请求的入口,路由的服务数量会很多,几十个到上百个都有可能,如果用线程池隔离,那么需要创建上百个独立的线程池,开销太大,用信号量隔离开销就小很多,还能起到限流的作用。

2025-11-05 21:42:00 735

原创 把 Spring Boot 项目从 18.18M 瘦身到 0.18M,部署超级快!

SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼:编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud等),那就更大了。这个时候如果想要对线上运行工程有一些微调,则非常痛苦。

2025-11-05 21:39:15 147

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除