- 博客(224)
- 收藏
- 关注
原创 糟糕,我实现的k8s informer好像是依托答辩
是一个同步的函数,持续执行list-watch-cache-react这个引擎, 在应用层面需要以子goroutine形式,client-go另有informer工厂,informerFactory.Start(stopCh) 内部也是启协程,这里也要认识到信道stopCh在golang中的通信作用。运行一个完整的informer: list ---> watch ---> cache---> react。④ 事件处理,应用在业务层面的动作,可以写日志,可以做controller的Reconcile动作。
2025-12-23 17:09:30
323
原创 在调度的花园里面挖呀挖
kueue资源池的配额约束了某些细粒度要求的资源池的逻辑使用边界(支持借用和抢占),通过resourceFalvor抽象出资源池的概念, kueue通过”排队“这个概念细化了准入这个动作,在kube-scheduler工作前管控了批处理任务的调度。下图是kueue的作用机制:任务满足配额准入后: 修改job的suspend: false,放行job,向job注入nodeselector注解,将本次资源风味相关的信息给到job,用于后续调度!未被准入的旧任务不会影响后续能被准入的新来任务。
2025-12-14 21:54:43
979
原创 在k8s调度的花园里面挖呀挖
kueue资源池的配额约束了某些细粒度要求的资源池的逻辑使用边界(支持借用和抢占),通过resourceFalvor抽象出资源池的概念, kueue通过”排队“这个概念细化了准入这个动作,在kube-scheduler工作前管控了批处理任务的调度。下图是kueue的作用机制:任务满足配额准入后: 修改job的suspend: false,放行job,向job注入nodeselector注解,将本次资源风味相关的信息给到job,用于后续调度!未被准入的旧任务不会影响后续能被准入的新来任务。
2025-12-14 21:54:43
330
原创 刚入职的AIops菜鸡,应该知道gang-scheduling和binpack调度吗?
粗略想象在第一个Pod被调度到节点A之后, 调度第二个Pod时, 节点A的MostAllocatedAlg = 2/6, 而节点B的MostAllocatedAlg = 2/8, 20的权重值在分子端占据更大因素,故第二个Pod也会更倾向于调度到节点A, 这样算法就做到了binpack。本文原创不易,特别是binpack的验证耗费了博主1个星期的倒腾时间,后面博主会将企业项目[云原生算力平台]做一个整体的架构梳理, 期待一键三连,交个朋友, 35+报团不迷路。
2025-12-05 14:47:56
634
原创 刚入职的AI菜鸡,应该知道gang-scheduling和binpack调度吗?
粗略想象在第一个Pod被调度到节点A之后, 调度第二个Pod时, 节点A的MostAllocatedAlg = 2/6, 而节点B的MostAllocatedAlg = 2/8, 20的权重值在分子端占据更大因素,故第二个Pod也会更倾向于调度到节点A, 这样算法就做到了binpack。本文原创不易,特别是binpack的验证耗费了博主1个星期的倒腾时间,后面博主会将企业项目[云原生算力平台]做一个整体的架构梳理, 期待一键三连,交个朋友, 35+报团不迷路。
2025-12-05 14:47:56
282
原创 网关上的限流器
按照上面的计算,应对1M/s的请求,需要10台redis分片实例。对于要求高精度的(涉及财务)的交易请求,推荐使用 cluster或者redis,kong网关的cluster策略其实就是使用kong 网关的数据存储postgres, 性能肯定没有redis好,但好在不需要引入新的组件。这里的关键是区分“有损服务” 和“完全不可用服务”, 体现的是“牺牲局部,保全整体”的设计哲学。④ 上文“漏桶算法”显示,排队中的请求会有等待的延迟时间,如果不希望过多的等待,指定。
2025-11-24 22:47:15
315
原创 新来的外包,在大群分享了它的限流算法的实现
redis作为限流计数器的外置存储,令牌桶算法在redis上实现原理:核心是使用hashmap存储当前请求用户的令牌桶状态(current_tokens, last_time), 落地时注意使用lua脚本避免竞态条件。上面还使用的redis expire机制: redis expire不是滑动过期,但是每次被请求触发执行的时候就重新设置TTL, 表现为“滑动过期”。这个思路也是极其常见的行为: redis可以成为用户令牌桶的全局中心存储: 当多个负载层需要读写用户限流器时,与redis交互。
2025-11-19 22:03:03
318
原创 新来的外包,限流算法用的这么6
Drawback:客户端可通过在两个时间窗口的边界堆砌请求(例如,在1min时间窗口的第59秒和下一个1min窗口的第1s都堆砌100 个请求), 轻松突破qps=100/min 语义。消耗令牌的速率某些时刻可能就不是恒定的:在突发大流量时,桶中暂存的令牌可以迅速给到请求用(这一瞬间突破qps语义),而不用像漏桶一样排队等待被处理(因漏水塑形)请求迅速堆满漏桶:后80个请求被拒绝,前20个请求被处理(第一个请求迅速被处理,第20个在第2s末被处理完,because恒定的漏水塑形)。
2025-11-03 16:31:32
567
原创 两张大图一次性讲透k8s调度器工作原理
当部署pod时,可以在pod manifest文件指定自定义的Scheduler, 这样调度器的调度决定就会基于你自定义的调度逻辑。从本质上讲,它会利用pod规格(cpu、memory、亲和性、污点、持久盘)过滤掉不适合运行特定pod的节点。pod priority: 高优先级的pod通过影响打分过程影响节点选择(高优Pod会先于低优Pod被调度)。pod拓扑分布: 确保 pod 分布在不同的拓扑域(如区域或节点)中,避免在一个地方集中过多pod。最后,排名最高的worker节点会被选中调度pod。
2025-10-25 23:01:05
435
原创 调试grpc的哼哈二将,你值得拥有
当客户端创建grpc通道,内部会创建到服务器的HTTP/2连接,通道创建完,就可以重用连接来发送多个到服务端的远程调用(多路复用)。这些远程调用会映射为HTTP/2中的流,远程调用中的消息以HTTP/2帧的形式进行发送,帧可能会携带一条gRPC长度前缀的消息,也可能在 gRPC消息非常大的情况下,一条消息跨多帧。kong网关原生支持代理gRPC请求,本文通过一个示例来记录通过kong网关管理gRPC服务,并且使用grpcbin和grpcurl哼哈二将来模拟和验证grpc服务能力。
2025-10-21 23:13:21
312
原创 有关CORS跨域请求,这事没完
默认preflight_continue = false, 意味着插件不将预检请求转发给upstream,所以此处保持默认就好, 网关会根据请求特征和CORS配置产生CORS响应头,并返回你。,但在常见的web编程实践中(凭据认证会在处理管道的前面),如果预检Options返回非200, 后续的实际请求就不会发起, 所以请考虑对预检Options请求忽略凭据访问。如果你手痒设置成true,那么预检请求就会转发到upstream,需要后端自己去忽略对预检Options请求的凭据认证。
2025-10-20 19:50:39
879
原创 JWT这点小秘密,你们肯定都知道!
用户一旦通过登录认证, 会被下发一个token, 之后的每次请求都会带上这个token, 将能访问该token允许的资源/服务, 单点登录广泛采用了jwt, 因为它负载轻量且自然跨域使用。B因为要校验A服务,也共享有A的secret, B也可以发出信息且产生sign=HS256(info, secret), 最终这个结果不能推断出是A发出的信息。非对称加密为什么可以?是因为用私钥签名后, 虽然可能很多人持有公钥能验签, 但根据私钥的私密性和非对称加密的配对性,能推断信息是持有私钥的一方发送的。
2025-08-26 12:26:59
326
原创 Go动态感知资源变更的常规套路,你指定用过!
作为面向算法开发者的云原生saas平台,平台在界面上提供了纳管集群的交互入口,平台启动后会去监听pytorch、mpi训练任务的状态变更,并回显到界面(并给开发者发送飞书变更通知)。最近在倒腾“AI大模型基础设施”, 目标是做一个基于云原生的AI算力平台,目前因公司隐私暂不能公开宏观背景和技术方案, 姑且记录实践中遇到的一些技能点。本文记录了使用定时任务感知资源变更,并利用golang信道作为变更重建信号的姿势,可作为golang中动态感知资源变化的常规套路。一次sql请求,返回分页数据和总条数?
2025-07-31 07:54:33
249
原创 Golang的文本模板,你指定没用过!
Arena有golang、python、java sdk, 早期我们尝试使用Arena sdk提交训练任务, 后面发现这个工具截止1.4.2版本时依旧是只支持单用户, 那么在用户粒度上使用该sdk就会有线程安全问题, 这个如果二开,改动还挺大。理论上还有另外一种启动子进程的方式: exec.Command("arena",args...), args 是参数切片,或者叫不定长参数,但是我们已经用模板字符串了,所以这里使用sh来启动子进程并自行解释arena参数比较合适。http请求超时,底层发生了什么?
2025-07-14 07:11:01
352
原创 双份请求,双倍快乐
这种乐观锁的思想去解决幂等问题有一个小弊端, 因为乐观锁的思想本是针对并发控制,它解决了并发请求中的重复请求这一子集场景,但是带来的副作用就是高并发时,很多请求会被拒绝,效率变低,但数据不一致问题没有了,双倍悲伤也不会有。如果你的实体更新的不频繁, 可以考虑使用基于乐观锁的版本状态来解决(总体上乐观锁是更宏达叙事的一个思路,在频繁更新场景下能处理幂等问题,但体验不佳)。在软件领域,同一动作请求并不总会只产生一次,这可能会带来一些问题: 想象你月底发薪,公司的转账指令错误的触发了2次,这是不是双倍快乐。
2025-03-31 07:58:21
809
原创 Ingress,你这个老6
Ingress-Nginx Controller是本次业务的声明式核心控制器,确保产生满足这一规则的NodePort类型的nginx服务,注意还需前置负载提供跨节点负载均衡能力。给了一个通过Ingress引流到"hello world“ 这样的演示服务,但是它的服务竟然采用了NodePort形式,这都NodePort了,还要你Ingress作甚。外部客户端---> 任意节点(NodePort)---> ClusterIP服务---> Pod。本篇内容为原创,读者可结合图片探索源码和官方, 欢迎反馈 ~。
2025-03-28 06:57:29
1043
原创 老八股谈事务处理,到底在谈什么?
回滚阶段: 以上剩下的事务日志,不包含commit record,说明事务日志还没有写完,这部分需要回滚,根据事务日志id到undolog中找到逻辑日志开始回滚。重做阶段: 从以上待恢复事务集合中,找出“含有commit record”的事务日志,这一部分已经写完事务日志,可以重做。业务上的操作组合与数据库的落盘行为在不同的时空维度,因数据库崩溃恢复的时机,导致数据库难以做到业务逻辑自洽的数据一致性。事务日志的生成就是事务提交的关键点,代表性的有阿里的Oceanbase, 但是有一个巨大的问题,
2025-03-16 18:17:12
1062
原创 协程池是调用端并发请求的缓释胶囊
动图显示,整体耗时相比于不用协程池无差, 但是每个请求的耗时都得到了很好的控制, 整个客户端程序批量发起1000个请求显得轻快又高效。总体而言, ants是golang中用于将高并发的Goroutine削峰填谷, 起到调用端缓释胶囊的作用。调用方某些场景下突发批量请求,一开始也是自然启动多协程发起请求,大量请求因为服务端限制而超时失败, 启动。hello, 我是马甲哥,这是我的第183篇原创文章,阅读时间3min,有用指数4颗星。既要让所有客户端请求都能被处理,又要保证不超过客户端自设的超时配置。
2025-03-14 07:47:51
984
原创 Golang倒腾一款简配的具有请求排队功能的并发受限服务器
golang官方指南[1]给了一些代码片段,层层递进演示了信道的能力:1>. 信号量2>. 限流能力var sem = make(chan int, MaxOutstanding)func Serve(queue chan *Request) { forreq := range queue { req:= req sem <- 1...
2025-03-12 18:07:33
1118
原创 记一次由context引起的进程OOM问题
之前写过《一种基于etcd实践节点自动故障转移的思路》, 程序经历过一次线上进程OOM的小事故, 本次技术复盘导致内存泄露的完整起因。提炼代码:业务函数etcdWatchLoop: 基于etcd的Watch机制持续监听/foo前缀键值对的变更; 收到Watch信道的变更消息,就去查询当前键值对。funcetcdWatchLoop()error{ctx, cancle := context...
2025-02-22 17:36:35
1001
原创 字节二面:你怎么理解信道是Golang中的顶级公民
1. 信道是Golang中的顶级公民goroutine结合信道channel是golang中实现并发编程的标配。信道给出了一种不同于传统共享内存并发通信的新思路,以一种通道复制的思想解耦了并发编程的各个参与方。信道分为两种: 无缓冲和有缓冲信道(先入先出)。分别用于goroutine同步和异步生产消费:无缓冲信道: 若没有反向的goroutine在做动作, 当前goroutine会阻塞;有缓冲信道...
2025-01-06 15:21:04
1069
原创 一种基于etcd实践节点自动故障转移的思路
自动故障转移是服务高可用的一种实现方式。mongodb,redis哨兵集群、 etcd都具备某种程度的故障转移能力。今天记录利用etcd选举sdk实践 服务自动故障转移服务以leader、follower多节点启动,日常leader接受所有业务流量,follower作为备用实例,不接受业务流量;监测到leader宕机,follower节点自动提升为leader并接管业务流量。1. 节点故障转移既然...
2024-12-23 16:58:24
1128
原创 http请求超时,底层发生了什么?
业务方反应调用接口超时,但是在服务端监控并没有看到5xx异常, 于是我们模拟一下请求超时时发生了什么?1.openresty模拟长耗时服务端延迟5s响应error_loglogs/error.log;http{server{listen80;charsetutf-8;location/reqtimeout{...
2024-12-04 17:19:49
816
原创 三张大图剖析HttpClient和IHttpClientFactory在DNS解析问题上的殊途同归
在开发者便利度角度,我们很轻松地使用HttpClient对象发出HTTP请求,只需要关注应用层协议的BaseAddr、Url、ReqHeader、timeout。实际在HttpClient请求在源码级别是 HttpMessageHandler在躬身前行。1. 早期.NET HttpClient遇到的Socket滥用/DNS解析问题早期.NET的HttpClient使用HttpClientHandl...
2024-11-19 09:23:17
682
1
原创 unix进程间通信信号的有效实践
背景最近优化了一版程序:用到了golang的优雅退出机制。程序使用leader/follower分布式高可用模型,所有的请求都会命中leader;使用etcd的election sdk做选主,需要在节点意外下线的时候,主动去etcd卸任(删除10s租约), 否则已经下线的节点还会被etcd认为是leader。所以在这里,优雅退出是技术刚需。另外根据[云原生十二要素方法论] 第9条:快速启动和优雅...
2024-09-30 18:58:07
946
原创 一次sql请求,返回分页数据和总条数
日常搬砖,总少不了需要获取分页数据和总行数。一直以来的实践是编码两次sql请求,分别拉分页数据和totalCount。最近我在思考:常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新,显而易见的优势:① 能显著减低“客户端和服务器之间的网络往返次数”,提高吞吐量② 简化客户端代码逻辑1. mysql 默认单sql请求单语句mysql客户端选项client_multi_statem...
2024-08-13 17:15:48
1540
1
原创 在浏览器输入网址,Enter之后发生了什么?
在浏览器输入网址,Enter之后发生了什么?很多八股文会给出:1.DNS Resolution2.Establishing a Connection3.Sending an Http Request4.Receiving the HTTP Response5.Rendering the Web Page但今天我斗胆插入第0.9步URL Parsing,URL( uniform resou...
2024-04-23 22:17:30
820
1
原创 async/await 贴脸输出,这次你总该明白了
出来混总是要还的最近在准备.NET Go核心能力的深度对比.note, 关于.NET/Go的异步实现总感觉没敲到点上。async/await是.NET界老生常谈的话题,每至于此,状态机又是必聊的话题,但是状态机又是比较晦涩难懂的话题。[一线码农大佬]在博客园2020年写的《await,async 我要把它翻个底朝天,这回你总该明白了吧[1]》手把手实现了异步状态机,这篇文章很是经典, 但是评论区很...
2024-04-16 07:37:59
833
原创 "家长进校园"之《计算机和人工智能》
半个月前报名了一年级的“家长进校园”活动,如履薄冰,左思右想、ppt做了几个晚上,不知道该如何同孩子们讲我们现在做的事情。上周五上台前,还很是忐忑,不过真的上台了,倒是完全放开了。上台也没有想象的那么可怕, 小朋友们也很新奇,反应也很激烈,算是相互配合吧。思考点1. 受众 & 形式:•一年级•ppt图片2. 目标:•计算机科普•立足知识、智力时代,促小朋友打好基础•宣...
2024-03-26 11:34:57
742
原创 缓存一梭子,程序员的快乐就是这么简单
缓存也是一把梭项目的标配,从业多年,有事无事set/getCache来一梭子。夜深人静的时候,头脑里冷不丁出现一些问题,我竟一时无法自圆其说1. 已经有cpu多级缓存、操作系统page cache,那为什么还需要定义应用缓存?2. 应用的多个副本缓存了同一份数据库数据, 怎么保证这些多副本的缓存一致性? 1.缓存在计算机体系中的地位2.缓存和缓冲的区别3...
2024-02-21 20:52:36
863
原创 .NET领域最硬核的gRPC 核心能力一把梭
前言,本文定位为.NET方向 grpc核心能力一把梭,全篇是姿势性和结论性的展示, 方便中高级程序员快速上手.NET Grpc。有关grpc更深层次的前世今生、底层原理、困惑点释疑请听下回分解, 欢迎菜鸟老鸟们提出宝贵意见。grpc宏观目标:高性能rpc框架grpc框架实现宏观目标的底层3协议http2通信协议, 基础能力proto buffer:打解包协议==> 二进制proto bu...
2024-01-15 16:56:06
1194
原创 tcpdump必知必会
1.tcpdump原理 & 在tcp协议栈的位置 2.tcpdump用法•基于协议、主机、端口过滤•使用and or逻辑运算符做复杂的过滤操作•tcpdump Flags1. tcpdump原理linux中非常有用的网络工具,运行在用户态。数据包到达网卡,经过数据包过滤器bpf筛选后,拷贝至用户态的tcpdump程序。tcpdump抓包“抓” 这个动作是由数据包过滤器bpf...
2023-11-09 19:48:02
240
原创 不能显式拦截ajax请求的302响应?
记录工作中早该加深印象的一个小小小case:ajax请求不能显式拦截 302响应。我们先来看一个常规的登录case:1.浏览器请求资源,服务器发现该请求未携带相关凭据(cookie或者token)2.服务器响应302,并在响应头Location写入重定向地址, 指示浏览器跳转到登录页3.浏览器跳转到登录页,提交身份信息,回调到原业务站点,服务端利用Set-Cookie响应头种下cookie或...
2023-10-01 18:08:05
308
原创 我大意了,没有闪。
本文的诞生,是有感于一线码农大佬前几日公众号发文《Dictionary.Clear 和 new Dictionary() 有什么不同?》,里面有两个栗子让我虎躯一震。1. 无心插花voidExample1(){varnewDict=newDictionary<string,string>();newDict.Add("key1","value1...
2023-08-19 08:30:40
232
原创 从斐波那契数列重温时间复杂度
(1) 函数调用存在压栈过程,会在线程栈(一般2M)上留下栈帧,斐波那契人递归算法:是函数自己调用自己,在终止条件后栈帧开始收敛,但是在此之前有可能已经撑爆线程栈。有些童鞋可能没意识到指数型的威力,举个例子, 斐波那契递归算法,第20个数字需要2^20次运算;一个老生常谈的思路是递归,另外是循环,今天借此机会回顾并演示时间复杂度在编程中的重要性。斐波那契 递归算法 1,1,2,3,5,8,13,21,34,55。从第1个数字移动到第n-2个数字时, 第n-2个数字。时间复杂复高,指数型O(2^n);
2023-08-16 10:26:42
217
原创 重温斐波那契数列,再看时间复杂度的重要性
•开题引入斐波那契•代码演示:递归、循环•递归 vs 循环•时间复杂复高,指数型O(2^n);推导过程•占用线程堆栈, 可能导致栈满异常•压测演示打入门软件开发,斐波那契数列便是绕不过去的简单编程算法。一个老生常谈的思路是递归,另外是循环,今天借此机会回顾并演示时间复杂度在编程中的重要性。斐波那契 递归算法 1,1,2,3,5,8,13,21,34,55递归算法的应用场景是:•将大...
2023-08-16 07:46:58
162
原创 golang中降本增效的常规实践
最近一年各大中小厂都在搞"优化",说到优化,目的还是"降本增效",降低成本,增加效益(效率)。技术层面,也有一些降本增效的常规操作。比如池化、io缓冲区技术golangC#eg.池化技术snnc.PoolObjectPool前端切图仔,归入前端资源池 , 随用随取字节数组缓冲区bytes.BufferList---io缓冲区bufioBufferStream适度超前,赛道埋伏池化技术 sync.P...
2023-07-28 08:49:01
347
1
原创 不会写单元测试的程序员不是一名合格的滴滴司机
go内置了一套单元测试机制:利用go test测试命令和一套按照约定方式编写的测试函数, os:比C#单元/基准测试要方便很多。在包目录内,所有以_test.go为后缀名编写的go文件不会参与go build的编译过程.本文所有的代码均放置在带缓冲区的异步写日志库[1]。go test 一共三种测试函数:•标准测试函数, 函数以Test为前缀,用于测试逻辑行为正确性, go test 会报告测试...
2023-07-10 17:03:49
155
原创 自古以来,同步/异步都是八股文第一章
成文耗时2小时,阅读8min,有用指数拉满。 好久没上线了,今天记录编程中老掉牙的几个关键术语,一个言简意赅的术语定义包含主谓宾定状补, 我们应从貌似雷同的术语中体会到不同术语的表象行为、侧重点。下面给出的3对技术术语,都是很核心、易混淆的概念点,但是多少还是有些表象、侧重点的不同。书读百遍其义自见,请关注最下方给出的微软官方技术文献, 自勉!!1. 同步/异步、 阻塞/非阻塞阻塞操作不...
2023-06-27 20:34:38
172
原创 自古以来,反射也是兵家必争之地
成文耗时1小时,阅读5min,有用指数5颗星。 这几天收到一个战术性需求,将一大坨字段序列化为特定格式的字符串。大概是下表:序号字段名描述是否必填0logVersion日志版本是1productName产品是2serviceName服务是.........25extend3扩展字段3否26extend4扩展字段3否27extend5扩展字段3否控制点1 : 必填字段少,若可...
2023-05-25 07:33:29
813
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅