MAT案例整理
开启Dump文件自动转储一般来说,线上运行的系统都会加上下面的 JVM 参数,以便如果线上出现 OOM 问题的时候,自动将事故现场保留下来。
12# 当程序出现OutofMemory时,将会在相应的目录下生成一份dump文件,如果不指定选项HeapDumpPath则在当前目录下生成dump文件-XX:+HeapDumpOnOutOfMemoryError -XX:ErrorFile=/logs/oom_dump/xxx.log -XX:HeapDumpPath=/logs/oom_dump/xxx.hprof
但是有某种情况下,pod会被k8s的某种保护机制下自动kill掉,那么dump文件没办法保存下来。此时也可以联系运维给这个服务加上EFS (Amazon 文件系统)等待下次出现能抓住这个问题。
EFS 是 Amazon 提供的完全托管的弹性网络文件系统,主要用于在 AWS 上运行的多台 EC2 实例之间 共享存储。它可以实现多个容器等实例同时挂载同一个 EFS 文件系统。
如果程序出现 OOM 之后,就是有代码存在内存泄漏的风险,这个时候即使能对外提供服务,其实也是有风险的, ...
玩转AI应用
大模型以下是一些常用大模型的特性以及区别:
厂商/系列
代表模型
核心特点
典型应用场景
开源/闭源
大致成本
OpenAI
GPT-3.5
成本(计算/资源)较低;能做一般写作、代码辅助、总结、翻译等任务;
对话式任务,对一般任务(写作、聊天、翻译、简单问题)非常合适
闭源
输入$0.5/百万tokens,输出$1.5/百万tokens
GPT-4o / GPT-4.1-series
通用性强,多模态(文本、图像、音频),生态整合好,引入更大的上下文支持
内容创作、复杂推理、代码生成、多模态分析
闭源
GPT-4.1 API: 输入$2/百万tokens, 输出$8/百万tokens
GPT-5
上下文长度:API 上输入 + 输出合起来可以 ~400K tokens 或更多,更好地处理非常长对话、文档、或混合任务(例如图像+文本长内容);逻辑推理:在推理深度、多步逻辑、工具调用/agent 工作流中是目前顶尖版本;被设计为“知道什么时候 fast 回答、什么时候 think 更久”的。多模 ...
如何设计一个秒杀系统
不同场景下的不同架构案例如果你想快速搭建一个简单的秒杀系统,只需要把你的商品购买页面增加一个“定时上架”功能,仅在秒杀开始时才让用户看到购买按钮,当商品的库存卖完了也就结束了。这就是当时第一个版本的秒杀系统实现方式。
但随着请求量的加大(比如从1w/s到了10w/s的量级),这个简单的架构很快就遇到了瓶颈,因此需要做架构改造来提升系统性能。这些架构改造包括:
把秒杀系统独立出来单独打造一个系统,这样可以有针对性地做优化,例如这个独立出来的系统就减少了店铺装修的功能,减少了页面的复杂度;
在系统部署上也独立做一个机器集群,这样秒杀的大流量就不会影响到正常的商品购买集群的机器负载;
将热点数据(如库存数据)单独放到一个缓存系统中,以提高“读性能”;
增加秒杀答题,防止有秒杀器抢单。
然而这个架构仍然支持不了超过100w/s的请求量,所以为了进一步提升秒杀系统的性能,我们又对架构做进一步升级,比如:
对页面进行彻底的动静分离,使得用户秒杀时不需要刷新整个页面,而只需要点击抢宝按钮,借此把页面刷新的数据降到最少;
在服务端对秒杀商品进行本地缓存,不需要再调 ...
Java并发编程实战
可见性、原子性和有序性问题:并发编程Bug的源头可见性在单核时代,所有的线程都是在一颗CPU上执行,CPU缓存与内存的数据一致性容易解决。
一个线程对共享变量的修改,另外一个线程能够立刻看到,我们称为可见性。
多核时代,每颗CPU都有自己的缓存,这时CPU缓存与内存的数据一致性就没那么容易解决了,当多个线程在不同的CPU上执行时,这些线程操作的是不同的CPU缓存。
每执行一次add10K()方法,都会循环10000次count+=1操作。在calc()方法中我们创建了两个线程,每个线程调用一次add10K()方法,循环10000次count+=1操作如果改为循环1亿次,你会发现效果更明显,最终count的值接近1亿,而不是2亿。如果循环10000次,count的值接近20000,原因是两个线程不是同时启动的,有一个时差。
原子性操作系统允许某个进程执行一小段时间,例如50毫秒,过了50毫秒操作系统就会重新选择一个进程来执行(我们称为“任务切换”),这个50毫秒称为“时间片”。
在一个时间片内,如果一个进程进行一个IO操作,例如读个文件,这个时候该进程可以把自 ...
uhr考勤
1自动生成年假1.1基本业务场景假期类型为定额类且规则是自动生成的需要定时任务自动生成假期,根据基准值和生成条件来确定年假生成的额度。
基准值:福利工龄日期、社会工龄日期!!#ff0000 生成条件!!:福利工龄日期满N个月、社会工龄日期满N个月
是否预支年假:是、否。即是生成已工作年份年假和未来为工作时间的年假(预支,员工刚入职生成今年一年的年假)基准值单位:月、自然年例如:基准值以月为单位:基准值单位选择为“月”,非预支类型年假,若起始日期为2022年10月1日,则2023年10月1日基准值满12个月示例:若年假计算规则:以“福利工龄”为基准值+“福利工龄”为基础条件+“自然年”为计算周期+取整方式为“向下取整”+额度单位为“天”+基准值单位为“月”: 小王于2015年7月12日首次参加工作,于2022年2月10日加入公司,公司规定:福利工龄满12个月(2023年2月10日)后给予年假,年假阶梯是福利工龄12个月60个月给予5天,60个月120个月给予7天。 小王于2022年5月10日,入职满12个月,此时生成年假。 计算规则为:(20221231-20220211)/ ...
kubernetes
基本概念虽然容器技术开启了云原生时代,但它也只走出了一小步,再继续前进就无能为力了,因为这已经不再是隔离一两个进程的普通问题,而是要隔离数不清的进程,还有它们之间互相通信、互相协作的超级问题,困难程度可以说是指数级别的上升。
这些容器之上的管理、调度工作,就是这些年最流行的词汇:“容器编排”(Container Orchestration)。
面对单机上的几个容器,“人肉”编排调度还可以应付,但如果规模上到几百台服务器、成千上万的容器,处理它们之间的复杂联系就必须要依靠计算机了,而目前计算机用来调度管理的“事实标准”,就是:Kubernetes。
Kubernetes就是一个生产级别的容器编排平台和集群管理系统,不仅能够创建、调度容器,还能够监控、管理服务器。
基本架构
Kubernetes采用了现今流行的“控制面/数据面”(Control Plane / Data Plane)架构,集群里的计算机被称为“节点”(Node),可以是实机也可以是虚机,少量的节点用作控制面来执行集群的管理维护工作,其他的大部分节点都被划归数据面,用来跑业务应用。
控制面的节点在Kube ...
docker的使用技巧
基本概念镜像镜像是容器的静态形式,它打包了应用程序的所有运行依赖项,方便保存和传输。使用容器技术运行镜像,就形成了动态的容器,由于镜像只读不可修改,所以应用程序的运行环境总是一致的。
容器
容器就是操作系统里一个特殊的“沙盒”环境,里面运行的进程只能看到受限的信息,与外部系统实现了隔离。
容器隔离的目的是为了系统安全,限制了进程能够访问的各种资源。
相比虚拟机技术,容器更加轻巧、更加高效,消耗的系统资源非常少,在云计算时代极具优势。
进入容器命令
1docker exec -it 062 sh
Docker DesktopDocker Desktop 是容器化应用开发与部署的一体化工具,支持在本地环境创建、管理和运行Docker容器。
很多人以为,只要换了新电脑或者格式化电脑后,在docker desktop拉取的镜像、容器都会消失,现在我就来介绍一下将 Docker Desktop 的容器打包成镜像,上传到 docker hub 的方法,以后就可以像代码一样管理维护自己的docker镜像。
Docker Hub在使用 docker pull 获取镜像的时候,我们并没有明确地指 ...
Redis实战:场景设计
Redis 热升级对于线上较大流量的业务,单个 Redis 实例的内存占用很容易达到数 G 的容量,对应的 aof 会占用数十 G 的空间。即便每天流量低峰时间,对 Redis 进行 rewriteaof,减少数据冗余,但由于业务数据多,写操作多,aof 文件仍然会达到 10G 以上。
此时,在 Redis 需要升级版本或修复 bug 时,如果直接重启变更,由于需要数据恢复,这个过程需要近 10 分钟的时间,时间过长,会严重影响系统的可用性。
首先构建一个 Redis 壳程序,将 redisServer 的所有属性(包括redisDb、client等)保存为全局变量。然后将 Redis 的处理逻辑代码全部封装到动态连接库 so 文件中。Redis 第一次启动,从磁盘加载恢复数据,在后续升级时,通过指令,壳程序重新加载 Redis 新的 so 文件,即可完成功能升级,毫秒级完成 Redis 的版本升级。而且整个过程中,所有 Client 连接仍然保留,在升级成功后,原有 Client 可以继续进行读写操作,整个过程对业务完全透明。
Redis 功能扩展在 Redis 使用中,也经常会遇到 ...
Spring循环依赖及解决原理
什么是循环依赖字面上理解就是A依赖B的同时,B也依赖了A。
体现在启动控制台就是以下的日志:
12345┌─────┐| asyncServiceImpl defined in file [D:\Download\GitLabProject\uhr\jr-uhr-provider\jr-uhr-attendance\target\classes\com\jr\uhr\gtd\service\impl\AsyncServiceImpl.class]↑ ↓| gtdClassServiceImpl defined in file [D:\Download\GitLabProject\uhr\jr-uhr-provider\jr-uhr-attendance\target\classes\com\jr\uhr\gtd\service\impl\GtdClassServiceImpl.class]└─────┘
体现在代码层次就是这个样子:
12345678910111213@Componentpublic class A { // A中注入了B @Autowir ...
销售提成计算引擎实现
销售提成计算引擎实现1. 模块概述该模块是销售提成计算系统的具体实现层,基于模板方法模式设计,实现了不同业务线(BPO、HRO)的提成计算逻辑。
2. 目录结构12345CopyInsertcalculation/engine/├── AbstractCalculationEngine.java # 抽象计算引擎基类├── CalculationEngine.java # 计算引擎接口├── BpoCalculationEngine.java # BPO业务线计算引擎实现└── HroCalculationEngine.java # HRO业务线计算引擎实现
3. 核心组件说明3.1 计算引擎接口CalculationEngine
定义了计算引擎的基本契约
核心方法:
calculation(CalculationDto): 执行业务数据核算
supportedProductLine(): 声明支持的产品线类型
3.2 抽象计算引擎AbstractCalculationEngine
实现了计算引擎的通用逻辑
核 ...