- 博客(172)
- 收藏
- 关注
原创 MQ消息积压问题
• 其次,才是排查解决异常问题。监控、日志分析是否消费端的业务逻辑代码出现了问题,优化消费端的业务处理逻辑。• 如果是突发问题,扩容消费实例,如果服务器资源不足,系统降级:关闭一些不重要的业务,减少发送方的数据量。在设计系统的时候,一定要保障消费端的消费的性能要高于生产端生产的性能。• 消息消费者的消费能力不足引起的。• 在扩容消费者实例的同时,必须要。如果出现积压,那一定是性能问题。• 跟消息队列本身没有关系。• 跟消息生产者没有关系。
2025-08-28 18:10:13
83
原创 如何确保MQ 消息不丢失?
在RocketMQ中,可以将刷盘的方式 ElushDiskrype 配置为SYCN_FLUSH 同步刷盘。如果Broker是多个节点组成的集群,至少将消息发送到2个以上的节点,再给客户端发送确认响应。客户端从MQ拉取消息后,执行用户的业务逻辑成功之后,再给MQ发送消费确认响应。通过请求、确认机制来保证消息的可靠传递。
2025-08-28 15:58:11
56
原创 初识分布式事务
订单服务,撤销预备状态,还原为待支付状态或者取消状态,库存服务删除冻结的库存,添加到可用的库存中。TCC 把事务运行过程分成 Try、Confirm / Cancel 两个阶段,每个阶段的逻辑由业务代码控制,避免了长事务,可以获取更高的性能。基于业务层面的事务控制,每个事务分支(订单服务、库存服务)都需要自己去实现对应的try、confirm/cancel接口,侵入比较强。订单服务,添加一个预备状态,修改为Updating,冻结当期订单的操作,而不是直接修改为支付成功。三个阶段:询问,锁定资源,真正执行。
2025-08-28 15:39:28
288
原创 docker 常用命令
绑定挂载卷 -v 宿主机目录 :容器目录。绑定端口 -p 宿主机端口 :容器端口。DockerCompos.yaml 进行容器编排。进入容器内部 -it。Dockerfile 制作镜像。docker pull 镜像。docker run 镜像。
2025-08-28 14:41:26
64
原创 MQ的比较
kafka 性能最高 时延相比 rocket 较低,思想是批处理,适合流计算、大数据领域。rabbitMQ 开箱即用方便,但性能相比最低,且 erlang 语言所写。rocketMQ 性能高 时延最低,可解决最终一致性的分布式事务。pulsar 在国外十分流行,有取代前三者的可能性。
2025-08-28 11:14:30
61
原创 RocketMQ 分布式事务方案
如果出现网路波动第 4 步没有发送成功,这样就会产生 MQ 不知道是不是需要给消费者消费的问题,他就像一个无头苍蝇一样。RocketMQ 事务消息的做法是:如果消息是 half 消息,放进特殊的消费队列,然后。,根据生产者组获取一个服务提供者发送回查事务状态请求,根据事务状态来决定是提交或回滚消息。指向系统 B 的操作已经和系统 A 不相关了,也就是说在消息队列中的分布式事务是——为 RMQ_SYS_TRANS_HALF_TOPIC。在第一步发送的 half 消息(,因为整个过程是异步的,
2025-08-27 17:32:39
258
原创 同步异步的比喻
同步就是食堂打饭,告诉阿姨你想吃什么,阿姨一个一个给你打好,然后你端在位置上吃。异步也是饭店吃饭,你先找个位置坐好,给服务员说你吃什么,做好了她给你端过来吃。
2025-08-26 17:21:21
87
原创 bufferPool
redo log 和 undo log 配合起来的作用就是:1.事务提交前崩溃,通过 undo log 回滚事务2.事务提交后崩溃,通过 redo log 恢复事务。(哈希表检索):直接返回内存数据。从磁盘加载数据到空闲页。
2025-08-26 16:49:15
201
原创 高可用架构分解
故障频率低:1.消除依赖、弱化依赖和控制依赖2.只用成熟的技术、职责单一化。业内高可用的标准是按照系统宕机时间来衡量的。故障恢复快,做日志监控。
2025-08-26 11:30:47
113
原创 既然 docker 已经覆盖了 pm2,pm2 还有存在的必要吗
4.当你更新了代码后,只需要执行 pm2 reload app。PM2会智能地逐一重启工作进程,而不是一次性全部杀死。它确保在任何时刻都至少有一个进程在正常提供服务,从而实现。3.PM2会自动检测服务器的CPU核心数,并启动相应数量的应用实例。(进程管理、负载均衡、高可用),并且做得更出色、更强大。,因为它们解决的是不同层面的问题(环境 vs 进程)1.守护进程,毫秒级自动重启。,会自动将进来的请求分发到这些实例上,,轻松吃满服务器的所有CPU资源。
2025-08-25 10:10:26
93
原创 初识推荐系统
最重要的还是梳理清楚整个推荐系统的架构,知道每一个部分需要完成哪些任务,是如何做的,主要的技术栈是什么,有哪些局限和可以研究的问题1.首先是客户端和服务端的实时数据处理。做埋点,将用户在平台上真实的行为记录下来,因为数据这种东西需要工程师去主动记录,既然做推荐系统,要分析用户行为,还要训练模型,显然需要数据。需要数据,就需要记录。2.流处理平台准实时数据处理,记录一些准实时的数据,可能存在几分钟的误差。那什么样的准实时数据需要记录呢?在推荐领域基本上只有一个类别,就是用户行为数据。
2025-08-20 16:56:43
590
原创 为什么说反射给java提供了一种动态特性
运行时确定:在程序运行时才知道要操作哪个类、哪个方法、哪个字段 (适配性的核心)很多框架运用反射技术,去写出通用的代码,适配用户的业务代码。反射提供了一种能力:在运行时动态获取和操作类的信息。
2025-08-19 17:13:13
72
原创 了解一下RPA,为什么落后
维度 (Dimension)传统 RPA现代浏览器自动化 (如 Playwright)谁“领先”?技术核心GUI识别,模拟操作浏览器协议/DOM操控浏览器自动化(更稳定、底层)目标用户业务人员、非技术人员开发者、测试工程师各有侧重开发方式低代码/无代码,拖拽式代码优先 (Python, JS等)浏览器自动化(对开发者更友好)稳定性脆弱,易受UI变化影响相对稳定,依赖代码结构浏览器自动化运行效率较慢,依赖UI渲染极快 (尤其无头模式)浏览器自动化成本许可证费用高昂开源免费浏览器自动化。
2025-08-11 11:48:35
153
原创 npm run 常见脚本
ackage.json 文件中 scripts 部分的脚本是为项目预定义的命令行快捷方式,可以通过 npm run <脚本名称> 来执行,大大简化了开发、构建和管理过程。
2025-08-08 10:42:14
597
原创 npm run dev & npm run build
特性/方面npm run dev (开发模式)npm run build (生产模式)目标用户开发者最终用户核心目的提升开发效率和体验提升应用性能和加载速度服务器启动一个带热更新的本地开发服务器不启动服务器,只生成文件输出结果通常在内存中,不生成永久文件在 dist 或 build 文件夹中生成静态文件构建速度快,牺牲优化换取速度慢,进行大量优化操作代码体积大,包含调试信息小,经过压缩和优化调试容易,有 Source Maps困难,代码被混淆和压缩使用场景日常编码、调试、测试新功能时。
2025-08-06 14:55:43
523
原创 为什么要三级缓存?两级不行吗?
三级缓存机制的核心思想是 “提前暴露引用”。当一个Bean还在创建过程中时,就先把它的一个“半成品”或“期货”通过缓存暴露出去,让其他依赖它的Bean可以继续创建流程,从而打破死循环。而三级缓存的设计,则是为了完美地兼容AOP代理。只用二级缓存(存放早期Bean实例)确实可以解决普通的循环依赖。但如果循环依赖中涉及到了AOP代理,二级缓存就不够了。
2025-07-31 17:02:47
113
原创 Bean Post-Processor
Bean Post-Processor,可以理解为 “Bean创建过程后期的处理器”。它的整个工作区间,都处于Bean创建流程的后半段(实例化和属性注入之后)。--- BeanPostProcessor 的工作区间开始 ------ BeanPostProcessor 的工作区间结束 ---
2025-07-31 16:53:10
307
原创 Spring Boot 默认使用 CGLIB,但CGLIB 无法代理 final 类或 final 方法
所以,Spring Boot 并没有“解决”这个问题,而是把问题清晰地抛给了开发者。首选方案:如果代码可控,移除 final 关键字。这是最简单、最直接的修复方式。备选方案:如果不能移除 final,就为这个类提取一个接口,然后在注入点使用接口,让 AOP 可以通过 JDK 代理工作(但这可能需要你手动将 spring.aop.proxy-target-class 设置为 false,或者进行更细粒度的控制)。终极方案:如果以上都不行,才考虑使用 AspectJ 静态织入。
2025-07-27 01:37:40
633
原创 代理对象内部方法调用无法触发 AOP 的问题。
从 Spring Boot 2.0 开始,默认的代理方式被改为了 CGLIB (spring.aop.proxy-target-class=true)。为了解决这种令人困惑的场景,提供更一致、更可预测的行为,Spring Boot 最终决定拥抱 CGLIB 作为默认选项。这是因为 CGLIB 解决了一个使用 JDK 代理时非常棘手的痛点:代理对象内部方法调用无法触发 AOP 的问题。
2025-07-27 01:35:58
268
原创 AOP中的代理选择
因为从 Spring Boot 2.0 开始,默认统一使用 CGLIB 代理。即使你的类实现了接口,Spring Boot 也优先用 CGLIB。这样做可以解决一些复杂的类型转换问题,让 AOP 的行为更加一致和可预测。在现代 Spring Boot 中,你基本可以不用操心这个选择。
2025-07-27 01:14:37
438
原创 限流组件中的本地缓存没必要搞复杂的内存淘汰机制
令牌桶缓存:按用户ID/IP限流,即使大型应用也就几万到几十万用户。- 黑名单缓存:触发限流的用户是少数,通常只有几百到几千个。- 总数据量:远小于1000个条目的默认限制。- 令牌桶:1分钟TTL,不活跃用户自动清除。- 黑名单:24小时TTL,自动解封。- 数据会自然减少,不会无限增长。1. 数据量天然有限。
2025-07-26 23:20:42
79
原创 nginx有几种日志
访问日志记录了每一个客户端对 Nginx 服务器发起的 HTTP 请求的详细信息。这对于分析用户行为、网站流量、性能监控和故障排查至关重要。错误日志记录了 Nginx 在启动、运行或关闭过程中遇到的所有错误和诊断信息。这是排查 Nginx 自身问题或与后端服务交互问题的首要工具。
2025-07-24 13:48:34
183
原创 线上异常ReadTimeout
异常信息: HTTPConnectionPool(host='47.xxx.xxx.xxx', port=80): Read timed out. (read timeout=3)时间: 2025-07-24 11:32:15。异常类型: ReadTimeout。详情: 调用房源图片识别接口失败。主机: ai-agent-1。
2025-07-24 11:43:47
408
原创 限流、熔断、降级
限流、熔断、降级是构建高可用、高弹性分布式系统的“三驾马车”。它们虽然都用于系统保护,但目的和应用场景各不相同。它们共同的目标是:在系统面临超预期压力或局部故障时,避免整个系统崩溃(即“雪崩效应”),保证核心服务的可用性。我用一个形象的比喻,把你的系统想象成一个大型商场。限流的核心在于 我能处理多少请求?熔断的核心是 防止雪崩效应。降级的核心是 丢车保帅。
2025-07-23 17:03:31
139
原创 ssh-copy-id
将你的本地公钥内容 (id_rsa.pub) 追加写入到远程的 ~/.ssh/authorized_keys 文件中。ssh-copy-id 是一个非常有用的 Shell 脚本命令,它的作用是。:一旦登录成功,它就在远程服务器上执行一小段命令。检查 ~/.ssh 目录是否存在,不存在则创建并设置权限为 700。它本质上就是帮你远程执行了所有必要的手动命令,既方便又不易出错。确保 authorized_keys 文件的权限是 600。的方式连接到 remoteuser@hostname。
2025-07-23 14:07:54
291
原创 加了pm2,再也不用半夜起来重启被打崩的服务
Nginx配置显示它作为反向代理将请求转发到内部的FastAPI服务,同时添加了一些HTTP头信息和超时设置,还支持WebSocket连接。客户端请求 → Nginx(80端口) → PM2管理的FastAPI(5000端口)
2025-07-18 20:31:39
321
原创 前端一些常见文件
它的核心作用a是:锁定项目所有依赖(包括依赖的依赖)的确切版本,以确保在任何时间、任何机器上 npm install 都能得到完全相同的 node_modules 目录结构。eslint.config.js 是一个用来配置代码检查工具 ESLint 的文件,它的核心作用是:定义一套代码书写规则,然后让 ESLint 自动检查你的代码是否遵守了这些规则。它的核心作用是:告诉 Vite 如何构建和运行你的前端项目。package.json 是一个JSON格式的文件,它描述了你的项目,并管理项目的依赖和元信息。
2025-07-18 11:10:39
204
原创 cors跨域资源共享
前端:单独的服务器/端口/域名下运行后端:独立的服务器/端口/域名下提供API这种分离本质上就创造了"跨域"场景,不是可选的设计决策,而是架构定义的一部分。
2025-07-17 17:22:56
211
原创 为什么喜欢叫index文件
**模块导入**:在Node.js或前端框架中,当导入一个目录时(如`import User from './user'`),系统会自动寻找并导入`./user/index.js`- **网页URL**:访问`http://example.com/users/`时,服务器会自动提供`/users/index.html`文件,无需在URL中显式指定文件名。- **React**:组件通常放在各自的文件夹中,并通过`index.js`导出。- **Node.js**:包的入口点通常是`index.js`
2025-07-17 16:52:19
265
原创 Content-Type 请求头
Content-Type是HTTP请求头的一个重要字段,它告诉服务器客户端发送的数据是什么格式。在前后端通信中,这非常关键。
2025-07-17 16:47:05
229
原创 map.containsKey() 为什么不是contain而是contains
containsKey() 方法之所以用: 让 object.method() 的调用读起来像一个通顺的英文句子 ("The map contains the key.")。: ...s 形式的动词通常表示一个的方法(返回 true/false),而动词原形通常表示一个的方法(会改变对象)。它触及了编程语言命名规范的核心!简单来说,这是遵循了和的结果,目的是为了让代码读起来更像自然语言,从而提高可读性。
2025-07-17 13:39:07
340
原创 一点点dd
logger.info(f"批量处理完成 {len(urls)} 张图片,总用时: {total_time:.2f}秒,平均每张: {total_time/len(urls):.2f}秒")- **批量处理**:3张图片并行处理时间约6.9秒(比串行处理快约50%)- **单图片处理**:平均处理时间约4.5-4.8秒。**实现内容**:将原有串行处理改造为异步并行架构。**实现内容**:优化下载和处理的超时设置。**实现内容**:使用信号量控制并发数量。**实现内容**:添加详细的性能指标记录。
2025-07-16 13:33:12
422
原创 502 & 504
502 错误发生时,表示 nginx 成功连接到了上游服务器(FastAPI应用),但收到了无效响应。504 错误表示 nginx 成功连接到上游服务器,但等待响应的时间超过了配置的超时时间。
2025-07-16 12:13:02
234
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人