- 博客(161)
- 收藏
- 关注
原创 既然 docker 已经覆盖了 pm2,pm2 还有存在的必要吗
4.当你更新了代码后,只需要执行 pm2 reload app。PM2会智能地逐一重启工作进程,而不是一次性全部杀死。它确保在任何时刻都至少有一个进程在正常提供服务,从而实现。3.PM2会自动检测服务器的CPU核心数,并启动相应数量的应用实例。(进程管理、负载均衡、高可用),并且做得更出色、更强大。,因为它们解决的是不同层面的问题(环境 vs 进程)1.守护进程,毫秒级自动重启。,会自动将进来的请求分发到这些实例上,,轻松吃满服务器的所有CPU资源。
2025-08-25 10:10:26
41
原创 初识推荐系统
最重要的还是梳理清楚整个推荐系统的架构,知道每一个部分需要完成哪些任务,是如何做的,主要的技术栈是什么,有哪些局限和可以研究的问题1.首先是客户端和服务端的实时数据处理。做埋点,将用户在平台上真实的行为记录下来,因为数据这种东西需要工程师去主动记录,既然做推荐系统,要分析用户行为,还要训练模型,显然需要数据。需要数据,就需要记录。2.流处理平台准实时数据处理,记录一些准实时的数据,可能存在几分钟的误差。那什么样的准实时数据需要记录呢?在推荐领域基本上只有一个类别,就是用户行为数据。
2025-08-20 16:56:43
582
原创 为什么说反射给java提供了一种动态特性
运行时确定:在程序运行时才知道要操作哪个类、哪个方法、哪个字段 (适配性的核心)很多框架运用反射技术,去写出通用的代码,适配用户的业务代码。反射提供了一种能力:在运行时动态获取和操作类的信息。
2025-08-19 17:13:13
67
原创 了解一下RPA,为什么落后
维度 (Dimension)传统 RPA现代浏览器自动化 (如 Playwright)谁“领先”?技术核心GUI识别,模拟操作浏览器协议/DOM操控浏览器自动化(更稳定、底层)目标用户业务人员、非技术人员开发者、测试工程师各有侧重开发方式低代码/无代码,拖拽式代码优先 (Python, JS等)浏览器自动化(对开发者更友好)稳定性脆弱,易受UI变化影响相对稳定,依赖代码结构浏览器自动化运行效率较慢,依赖UI渲染极快 (尤其无头模式)浏览器自动化成本许可证费用高昂开源免费浏览器自动化。
2025-08-11 11:48:35
151
原创 npm run 常见脚本
ackage.json 文件中 scripts 部分的脚本是为项目预定义的命令行快捷方式,可以通过 npm run <脚本名称> 来执行,大大简化了开发、构建和管理过程。
2025-08-08 10:42:14
593
原创 npm run dev & npm run build
特性/方面npm run dev (开发模式)npm run build (生产模式)目标用户开发者最终用户核心目的提升开发效率和体验提升应用性能和加载速度服务器启动一个带热更新的本地开发服务器不启动服务器,只生成文件输出结果通常在内存中,不生成永久文件在 dist 或 build 文件夹中生成静态文件构建速度快,牺牲优化换取速度慢,进行大量优化操作代码体积大,包含调试信息小,经过压缩和优化调试容易,有 Source Maps困难,代码被混淆和压缩使用场景日常编码、调试、测试新功能时。
2025-08-06 14:55:43
514
原创 为什么要三级缓存?两级不行吗?
三级缓存机制的核心思想是 “提前暴露引用”。当一个Bean还在创建过程中时,就先把它的一个“半成品”或“期货”通过缓存暴露出去,让其他依赖它的Bean可以继续创建流程,从而打破死循环。而三级缓存的设计,则是为了完美地兼容AOP代理。只用二级缓存(存放早期Bean实例)确实可以解决普通的循环依赖。但如果循环依赖中涉及到了AOP代理,二级缓存就不够了。
2025-07-31 17:02:47
112
原创 Bean Post-Processor
Bean Post-Processor,可以理解为 “Bean创建过程后期的处理器”。它的整个工作区间,都处于Bean创建流程的后半段(实例化和属性注入之后)。--- BeanPostProcessor 的工作区间开始 ------ BeanPostProcessor 的工作区间结束 ---
2025-07-31 16:53:10
303
原创 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
627
原创 代理对象内部方法调用无法触发 AOP 的问题。
从 Spring Boot 2.0 开始,默认的代理方式被改为了 CGLIB (spring.aop.proxy-target-class=true)。为了解决这种令人困惑的场景,提供更一致、更可预测的行为,Spring Boot 最终决定拥抱 CGLIB 作为默认选项。这是因为 CGLIB 解决了一个使用 JDK 代理时非常棘手的痛点:代理对象内部方法调用无法触发 AOP 的问题。
2025-07-27 01:35:58
265
原创 AOP中的代理选择
因为从 Spring Boot 2.0 开始,默认统一使用 CGLIB 代理。即使你的类实现了接口,Spring Boot 也优先用 CGLIB。这样做可以解决一些复杂的类型转换问题,让 AOP 的行为更加一致和可预测。在现代 Spring Boot 中,你基本可以不用操心这个选择。
2025-07-27 01:14:37
434
原创 限流组件中的本地缓存没必要搞复杂的内存淘汰机制
令牌桶缓存:按用户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
182
原创 线上异常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
401
原创 限流、熔断、降级
限流、熔断、降级是构建高可用、高弹性分布式系统的“三驾马车”。它们虽然都用于系统保护,但目的和应用场景各不相同。它们共同的目标是:在系统面临超预期压力或局部故障时,避免整个系统崩溃(即“雪崩效应”),保证核心服务的可用性。我用一个形象的比喻,把你的系统想象成一个大型商场。限流的核心在于 我能处理多少请求?熔断的核心是 防止雪崩效应。降级的核心是 丢车保帅。
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
280
原创 加了pm2,再也不用半夜起来重启被打崩的服务
Nginx配置显示它作为反向代理将请求转发到内部的FastAPI服务,同时添加了一些HTTP头信息和超时设置,还支持WebSocket连接。客户端请求 → Nginx(80端口) → PM2管理的FastAPI(5000端口)
2025-07-18 20:31:39
312
原创 前端一些常见文件
它的核心作用a是:锁定项目所有依赖(包括依赖的依赖)的确切版本,以确保在任何时间、任何机器上 npm install 都能得到完全相同的 node_modules 目录结构。eslint.config.js 是一个用来配置代码检查工具 ESLint 的文件,它的核心作用是:定义一套代码书写规则,然后让 ESLint 自动检查你的代码是否遵守了这些规则。它的核心作用是:告诉 Vite 如何构建和运行你的前端项目。package.json 是一个JSON格式的文件,它描述了你的项目,并管理项目的依赖和元信息。
2025-07-18 11:10:39
202
原创 cors跨域资源共享
前端:单独的服务器/端口/域名下运行后端:独立的服务器/端口/域名下提供API这种分离本质上就创造了"跨域"场景,不是可选的设计决策,而是架构定义的一部分。
2025-07-17 17:22:56
210
原创 为什么喜欢叫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
249
原创 Content-Type 请求头
Content-Type是HTTP请求头的一个重要字段,它告诉服务器客户端发送的数据是什么格式。在前后端通信中,这非常关键。
2025-07-17 16:47:05
223
原创 map.containsKey() 为什么不是contain而是contains
containsKey() 方法之所以用: 让 object.method() 的调用读起来像一个通顺的英文句子 ("The map contains the key.")。: ...s 形式的动词通常表示一个的方法(返回 true/false),而动词原形通常表示一个的方法(会改变对象)。它触及了编程语言命名规范的核心!简单来说,这是遵循了和的结果,目的是为了让代码读起来更像自然语言,从而提高可读性。
2025-07-17 13:39:07
336
原创 一点点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
420
原创 502 & 504
502 错误发生时,表示 nginx 成功连接到了上游服务器(FastAPI应用),但收到了无效响应。504 错误表示 nginx 成功连接到上游服务器,但等待响应的时间超过了配置的超时时间。
2025-07-16 12:13:02
226
原创 为什么要使用nginx?
针对您之前遇到的502和504错误,这正是因为Nginx作为反向代理在等待FastAPI应用响应时发生的超时问题。解决方法是调整Nginx的超时设置,或者优化FastAPI应用以更快地处理请求。
2025-07-16 11:03:04
180
原创 netstat -tlnp | grep 5000
netstat 是一个用于显示网络状态(network statistics)的命令行工具。: 这个命令会从输入中(在这里是 netstat 命令的输出)查找包含字符串 "5000" 的所有行。在大多数系统中,使用此选项需要 root 用户(或使用 sudo)权限,否则可能无法显示进程信息。grep 是一个强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。: 表示显示监听该端口的程序名称(Program Name)和进程ID(PID)。: 表示仅显示 TCP 协议相关的连接。
2025-07-15 22:56:26
395
原创 第二次线上事故
1. 在`download_image`函数中增加对`application/octet-stream`的处理。- 重新启动服务:`uvicorn main:app --host 0.0.0.0 --port 5000`- 某些图片URL返回`application/octet-stream`而不是`image/jpeg`**问题原因推测**:进程可能在某个Gemini API调用处阻塞。- 进程管理:`ps`, `kill`, `nohup`1. **进程管理**:如何排查和处理无响应的服务进程。
2025-07-15 22:50:09
352
原创 僵尸进程Zombie Process
僵死进程就是一个已经死了但还存在的子进程,就是因为他的父进程没有给他收尸孤儿进程就是一个没有父进程的子进程。
2025-07-15 17:53:39
383
原创 解读 top 命令/性能监控工具
example:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2025-07-15 17:45:42
471
原创 同一个浏览器中把 cookie 1 切换到cookie 2,会导致cookie 1失效
1. **浏览器上下文复用**:当前的实现中,同一个浏览器实例(`CustomBrowser`)在切换账号时会复用同一个浏览器上下文(`BrowserContext`)。logger.info(f"🧹 已清理 {len(xiaohongshu_cookies_to_clear)} 个现有cookies")logger.info(f"✅ 成功设置 {len(playwright_cookies)} 个新cookies到浏览器")这个方法会**直接添加新cookies到同一个浏览器上下文**,而不是替换。
2025-07-11 15:33:23
737
原创 Browser-use
是一个旨在将 Agent 与真实浏览器进行交互的 Python 库,可以轻松实现浏览器自动化。在配合 LLM使用时,browser-use 能够让你的agent发起对网页的访问、操作页面元素、收集信息、执行脚本等,从而扩展 AI 应用的落地场景。
2025-07-03 15:39:21
103
原创 server-rs
一个业务服务之所以能“一直处理请求”,是因为有一个“东西”在背后做着持续监听、接收请求、管理连接等底层工作。我们把这个“东西”统称为“服务器”(软件)“服务器”具体形态的认知——它不再是一个必须独立运行的外部软件,而是可以像乐高积木一样,被直接内嵌到你的项目代码里,让你的项目“天生就是一台服务器”这个理念是永恒不变的。无论是过去、现在还是未来,一个网络服务都需要这个底层的“服务器”来支撑。在与cursor交流中,还是越来越明白了之前 没有管过的一些"常识"server本身这个词就不确指单单这一个东西。
2025-07-02 14:18:39
287
原创 raft-rs
Consensus Module,核心共识算法模块;State Machine,保存用户数据的地方;Transport,用于通信的网络层。log,保存 Raft 日志的地方;
2025-07-01 16:10:17
213
原创 curl -s http://localhost:8080/ | head -3
提取输入内容的前若干行。:指定提取前 3 行。
2025-07-01 12:55:54
188
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人