- 博客(210)
- 收藏
- 关注
原创 双份请求,双倍快乐
这种乐观锁的思想去解决幂等问题有一个小弊端, 因为乐观锁的思想本是针对并发控制,它解决了并发请求中的重复请求这一子集场景,但是带来的副作用就是高并发时,很多请求会被拒绝,效率变低,但数据不一致问题没有了,双倍悲伤也不会有。如果你的实体更新的不频繁, 可以考虑使用基于乐观锁的版本状态来解决(总体上乐观锁是更宏达叙事的一个思路,在频繁更新场景下能处理幂等问题,但体验不佳)。在软件领域,同一动作请求并不总会只产生一次,这可能会带来一些问题: 想象你月底发薪,公司的转账指令错误的触发了2次,这是不是双倍快乐。
2025-03-31 07:58:21
750
原创 Ingress,你这个老6
Ingress-Nginx Controller是本次业务的声明式核心控制器,确保产生满足这一规则的NodePort类型的nginx服务,注意还需前置负载提供跨节点负载均衡能力。给了一个通过Ingress引流到"hello world“ 这样的演示服务,但是它的服务竟然采用了NodePort形式,这都NodePort了,还要你Ingress作甚。外部客户端---> 任意节点(NodePort)---> ClusterIP服务---> Pod。本篇内容为原创,读者可结合图片探索源码和官方, 欢迎反馈 ~。
2025-03-28 06:57:29
983
原创 老八股谈事务处理,到底在谈什么?
回滚阶段: 以上剩下的事务日志,不包含commit record,说明事务日志还没有写完,这部分需要回滚,根据事务日志id到undolog中找到逻辑日志开始回滚。重做阶段: 从以上待恢复事务集合中,找出“含有commit record”的事务日志,这一部分已经写完事务日志,可以重做。业务上的操作组合与数据库的落盘行为在不同的时空维度,因数据库崩溃恢复的时机,导致数据库难以做到业务逻辑自洽的数据一致性。事务日志的生成就是事务提交的关键点,代表性的有阿里的Oceanbase, 但是有一个巨大的问题,
2025-03-16 18:17:12
1002
原创 协程池是调用端并发请求的缓释胶囊
动图显示,整体耗时相比于不用协程池无差, 但是每个请求的耗时都得到了很好的控制, 整个客户端程序批量发起1000个请求显得轻快又高效。总体而言, ants是golang中用于将高并发的Goroutine削峰填谷, 起到调用端缓释胶囊的作用。调用方某些场景下突发批量请求,一开始也是自然启动多协程发起请求,大量请求因为服务端限制而超时失败, 启动。hello, 我是马甲哥,这是我的第183篇原创文章,阅读时间3min,有用指数4颗星。既要让所有客户端请求都能被处理,又要保证不超过客户端自设的超时配置。
2025-03-14 07:47:51
907
原创 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
977
原创 记一次由context引起的进程OOM问题
之前写过《一种基于etcd实践节点自动故障转移的思路》, 程序经历过一次线上进程OOM的小事故, 本次技术复盘导致内存泄露的完整起因。提炼代码:业务函数etcdWatchLoop: 基于etcd的Watch机制持续监听/foo前缀键值对的变更; 收到Watch信道的变更消息,就去查询当前键值对。funcetcdWatchLoop()error{ctx, cancle := context...
2025-02-22 17:36:35
906
原创 字节二面:你怎么理解信道是Golang中的顶级公民
1. 信道是Golang中的顶级公民goroutine结合信道channel是golang中实现并发编程的标配。信道给出了一种不同于传统共享内存并发通信的新思路,以一种通道复制的思想解耦了并发编程的各个参与方。信道分为两种: 无缓冲和有缓冲信道(先入先出)。分别用于goroutine同步和异步生产消费:无缓冲信道: 若没有反向的goroutine在做动作, 当前goroutine会阻塞;有缓冲信道...
2025-01-06 15:21:04
966
原创 一种基于etcd实践节点自动故障转移的思路
自动故障转移是服务高可用的一种实现方式。mongodb,redis哨兵集群、 etcd都具备某种程度的故障转移能力。今天记录利用etcd选举sdk实践 服务自动故障转移服务以leader、follower多节点启动,日常leader接受所有业务流量,follower作为备用实例,不接受业务流量;监测到leader宕机,follower节点自动提升为leader并接管业务流量。1. 节点故障转移既然...
2024-12-23 16:58:24
991
原创 http请求超时,底层发生了什么?
业务方反应调用接口超时,但是在服务端监控并没有看到5xx异常, 于是我们模拟一下请求超时时发生了什么?1.openresty模拟长耗时服务端延迟5s响应error_loglogs/error.log;http{server{listen80;charsetutf-8;location/reqtimeout{...
2024-12-04 17:19:49
656
原创 三张大图剖析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
611
1
原创 unix进程间通信信号的有效实践
背景最近优化了一版程序:用到了golang的优雅退出机制。程序使用leader/follower分布式高可用模型,所有的请求都会命中leader;使用etcd的election sdk做选主,需要在节点意外下线的时候,主动去etcd卸任(删除10s租约), 否则已经下线的节点还会被etcd认为是leader。所以在这里,优雅退出是技术刚需。另外根据[云原生十二要素方法论] 第9条:快速启动和优雅...
2024-09-30 18:58:07
844
原创 一次sql请求,返回分页数据和总条数
日常搬砖,总少不了需要获取分页数据和总行数。一直以来的实践是编码两次sql请求,分别拉分页数据和totalCount。最近我在思考:常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新,显而易见的优势:① 能显著减低“客户端和服务器之间的网络往返次数”,提高吞吐量② 简化客户端代码逻辑1. mysql 默认单sql请求单语句mysql客户端选项client_multi_statem...
2024-08-13 17:15:48
1390
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
749
1
原创 async/await 贴脸输出,这次你总该明白了
出来混总是要还的最近在准备.NET Go核心能力的深度对比.note, 关于.NET/Go的异步实现总感觉没敲到点上。async/await是.NET界老生常谈的话题,每至于此,状态机又是必聊的话题,但是状态机又是比较晦涩难懂的话题。[一线码农大佬]在博客园2020年写的《await,async 我要把它翻个底朝天,这回你总该明白了吧[1]》手把手实现了异步状态机,这篇文章很是经典, 但是评论区很...
2024-04-16 07:37:59
780
原创 "家长进校园"之《计算机和人工智能》
半个月前报名了一年级的“家长进校园”活动,如履薄冰,左思右想、ppt做了几个晚上,不知道该如何同孩子们讲我们现在做的事情。上周五上台前,还很是忐忑,不过真的上台了,倒是完全放开了。上台也没有想象的那么可怕, 小朋友们也很新奇,反应也很激烈,算是相互配合吧。思考点1. 受众 & 形式:•一年级•ppt图片2. 目标:•计算机科普•立足知识、智力时代,促小朋友打好基础•宣...
2024-03-26 11:34:57
600
原创 缓存一梭子,程序员的快乐就是这么简单
缓存也是一把梭项目的标配,从业多年,有事无事set/getCache来一梭子。夜深人静的时候,头脑里冷不丁出现一些问题,我竟一时无法自圆其说1. 已经有cpu多级缓存、操作系统page cache,那为什么还需要定义应用缓存?2. 应用的多个副本缓存了同一份数据库数据, 怎么保证这些多副本的缓存一致性? 1.缓存在计算机体系中的地位2.缓存和缓冲的区别3...
2024-02-21 20:52:36
808
原创 .NET领域最硬核的gRPC 核心能力一把梭
前言,本文定位为.NET方向 grpc核心能力一把梭,全篇是姿势性和结论性的展示, 方便中高级程序员快速上手.NET Grpc。有关grpc更深层次的前世今生、底层原理、困惑点释疑请听下回分解, 欢迎菜鸟老鸟们提出宝贵意见。grpc宏观目标:高性能rpc框架grpc框架实现宏观目标的底层3协议http2通信协议, 基础能力proto buffer:打解包协议==> 二进制proto bu...
2024-01-15 16:56:06
1081
原创 tcpdump必知必会
1.tcpdump原理 & 在tcp协议栈的位置 2.tcpdump用法•基于协议、主机、端口过滤•使用and or逻辑运算符做复杂的过滤操作•tcpdump Flags1. tcpdump原理linux中非常有用的网络工具,运行在用户态。数据包到达网卡,经过数据包过滤器bpf筛选后,拷贝至用户态的tcpdump程序。tcpdump抓包“抓” 这个动作是由数据包过滤器bpf...
2023-11-09 19:48:02
202
原创 不能显式拦截ajax请求的302响应?
记录工作中早该加深印象的一个小小小case:ajax请求不能显式拦截 302响应。我们先来看一个常规的登录case:1.浏览器请求资源,服务器发现该请求未携带相关凭据(cookie或者token)2.服务器响应302,并在响应头Location写入重定向地址, 指示浏览器跳转到登录页3.浏览器跳转到登录页,提交身份信息,回调到原业务站点,服务端利用Set-Cookie响应头种下cookie或...
2023-10-01 18:08:05
271
原创 我大意了,没有闪。
本文的诞生,是有感于一线码农大佬前几日公众号发文《Dictionary.Clear 和 new Dictionary() 有什么不同?》,里面有两个栗子让我虎躯一震。1. 无心插花voidExample1(){varnewDict=newDictionary<string,string>();newDict.Add("key1","value1...
2023-08-19 08:30:40
199
原创 从斐波那契数列重温时间复杂度
(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
144
原创 重温斐波那契数列,再看时间复杂度的重要性
•开题引入斐波那契•代码演示:递归、循环•递归 vs 循环•时间复杂复高,指数型O(2^n);推导过程•占用线程堆栈, 可能导致栈满异常•压测演示打入门软件开发,斐波那契数列便是绕不过去的简单编程算法。一个老生常谈的思路是递归,另外是循环,今天借此机会回顾并演示时间复杂度在编程中的重要性。斐波那契 递归算法 1,1,2,3,5,8,13,21,34,55递归算法的应用场景是:•将大...
2023-08-16 07:46:58
123
原创 golang中降本增效的常规实践
最近一年各大中小厂都在搞"优化",说到优化,目的还是"降本增效",降低成本,增加效益(效率)。技术层面,也有一些降本增效的常规操作。比如池化、io缓冲区技术golangC#eg.池化技术snnc.PoolObjectPool前端切图仔,归入前端资源池 , 随用随取字节数组缓冲区bytes.BufferList---io缓冲区bufioBufferStream适度超前,赛道埋伏池化技术 sync.P...
2023-07-28 08:49:01
304
1
原创 不会写单元测试的程序员不是一名合格的滴滴司机
go内置了一套单元测试机制:利用go test测试命令和一套按照约定方式编写的测试函数, os:比C#单元/基准测试要方便很多。在包目录内,所有以_test.go为后缀名编写的go文件不会参与go build的编译过程.本文所有的代码均放置在带缓冲区的异步写日志库[1]。go test 一共三种测试函数:•标准测试函数, 函数以Test为前缀,用于测试逻辑行为正确性, go test 会报告测试...
2023-07-10 17:03:49
105
原创 自古以来,同步/异步都是八股文第一章
成文耗时2小时,阅读8min,有用指数拉满。 好久没上线了,今天记录编程中老掉牙的几个关键术语,一个言简意赅的术语定义包含主谓宾定状补, 我们应从貌似雷同的术语中体会到不同术语的表象行为、侧重点。下面给出的3对技术术语,都是很核心、易混淆的概念点,但是多少还是有些表象、侧重点的不同。书读百遍其义自见,请关注最下方给出的微软官方技术文献, 自勉!!1. 同步/异步、 阻塞/非阻塞阻塞操作不...
2023-06-27 20:34:38
143
原创 自古以来,反射也是兵家必争之地
成文耗时1小时,阅读5min,有用指数5颗星。 这几天收到一个战术性需求,将一大坨字段序列化为特定格式的字符串。大概是下表:序号字段名描述是否必填0logVersion日志版本是1productName产品是2serviceName服务是.........25extend3扩展字段3否26extend4扩展字段3否27extend5扩展字段3否控制点1 : 必填字段少,若可...
2023-05-25 07:33:29
790
原创 Go编程快闪之logrus日志库
成文耗时1小时,阅读3min,有用指数4颗星。golang中常见的日志包是logrus, 根据logrus的胚子和我们的生产要求,给出一个生产可用的logrus实践姿势。主谓宾定状补logrus是一个结构化的、可插拔的、兼容golang标准log api的日志库。快速过一下能力•支持对output=TTY增加关键字颜色•内置JSONFormatter和TextFormatter(默认)两种Fo...
2023-05-24 16:13:00
579
原创 粘包/拆包问题一直都存在,只是到TCP就拆不动了。
•OSI open-system-Interconnection•TCP/IP 5层协议栈•应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api•TCP/UDP 概况•TCP粘包问题•结合TCP/IP报头再回顾,柳暗花明OSI开放系统互联定义了网络框架,以层为单位实现协议,同时控制权逐层传递。OSI实际并没有落地,TCP/IP5层协议栈是目前主流的落地实现。TCP...
2023-05-08 08:10:27
294
原创 你认为的.NET数据库连接池,真的是全部吗?
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接被收拢到配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是开箱即用的。DBA能在对业务方无侵入的情况下,让大规模微服务实例切换数据库连接,之后DBA要求, 那么问题来了: **dotnet程序怎么清空数据库连接?
2023-03-30 16:56:57
889
1
原创 流量调度、微服务可寻址性和注册中心
前言现代计算机基于计算、存储和调度的体系, 于是现代架构都是围绕这三大话题不断演进。在基础架构部, 也是主要为了解决这三个难题,为业务事业部提供透明的、高可用、可快速伸缩的三大能力, 我们组主要负责 [流量调度] 这个话题,下面是一些宏观的技术笔记。在单体结构, 流量调度是直观且无感的(DNS+Nginx就可以完成一次流量调度)。演进到微服务结构(服务粒度变得更细、服务伸缩更灵活(上下线更加频繁)...
2023-03-23 08:00:32
184
原创 问道Golang,6月龄必知必会(二)
在我看来,golnag有许多反直观的设计,而且这些设计通常不能自圆其说,导致gohper一而再再而三的调入陷阱。网上也有很多gohper总结了一些笔记,我再提炼精简一下,挂在脑图树上便于记忆。值类型包括:所有integer、所有float、bool、string、数组和structure引用类型包括:指针、slice、map、chan、interface1. map需要先先初始化,才能使用issu...
2023-03-12 16:41:11
196
原创 摸鱼快报:golang net/http中的雕虫小技
以后会开一个板块,摸鱼快报,快速记录这几周开发中雕虫小技, 也算一个错题集。1. 向开发环境localhost:3000种植cookie前端使用Create React App脚手架,默认以localhost:3000端口启动;后端使用golang-gin框架,使用8034端口启动。登录模块走的是sso,前后端分离,后端需要向前端写入认证cookiec.SetSameSite(http.SameS...
2023-01-13 18:18:17
880
1
原创 你认识的C# foreach语法糖,真的是全部吗?
本文的知识点其实由golang知名的for循环陷阱发散而来,对应到我的主力语言C#, 其实牵涉到闭包、foreach。为了便于理解,我重新组织了语言,以倒叙结构行文。先给大家提炼出一个C#题:观察for、foreach闭包的差异左边输出 5个5;右边输出0,1,2,3,4, 答对的、不屑看题的同学都可以出门右转了。闭包是在词法环境中捕获自由变量的头等函数, 题中关键是捕获的自由变...
2022-11-21 07:53:18
264
原创 Go语言正/反向代理的姿势
先重温一下什么叫反向代理,正向代理。鹅厂二面,nginx回忆录[1]所谓正向,反向代理取决于代理的是出站请求,还是入站请求。正向代理:代理的出站请求, 客户端能感知到代理程序,架构上距离客户端更近。反向代理:代理的是入站请求,客户端认为代理程序就是服务器,客户端感知不到代理逻辑,架构上距离服务端更近。前几天利用golang实现反向代理程序[2],引出了Host请求头在反代中的关键作用。代理程序预置...
2022-11-07 08:41:47
868
原创 两将军问题和TCP三次握手
两将军问题,又被称为两将军悖论、两军问题, 是一个经典的计算机思想实验。首先, 为避免混淆,我们需要认识到两将军问题虽然与拜占庭将军问题相关,但两者不是一个东西。拜占庭将军问题是一个更通用的两将军问题版本, 通常在分布式系统故障容错、区块链中广泛讨论也会犹豫。1.两将军问题两支军队,驻扎在两个山头,准备攻击山谷里的同一伙敌人,两将军只有同时发起进攻才能获胜,两将军约定攻击时间的的唯一方式是派遣信使...
2022-10-10 06:36:06
1071
原创 面向对象五大设计原则
最近在看七牛云许式伟的架构课,重温了面向对象五大设计原则(SOLID),扣理论文字找出处。(当然许老板是不可能深聊这么低级的内容,????)注意区分设计原则和设计模式。设计原则更为抽象和泛化;设计模式也是抽象或泛化的良好实践,但是它们提供了更具体和实用的底层建议。面向对象5大设计原则Single Responsiblity Principle单一职责原则Open/Closed Principle开闭原...
2022-09-28 07:29:03
294
原创 ConcurrentDictionary字典操作竟然不全是线程安全的?
好久不见,马甲哥封闭居家半个月,记录之前遇到的一件小事。标题不准确,实际上ConcurrentDictionary<TKey,TValue>绝大部分api都是线程安全且原子性的[1],唯二的例外是接收工厂函数的api:AddOrUpdate、GetOrAdd,这两个api不是原子性的,需要引起重视。All these operations are atomic and are thre...
2022-09-16 06:26:04
448
原创 Go语言反向代理的姿势
正向代理的血案前几天打算使用golang做一个代理程序,golang标准库net/http/httputil已经提供了这样的能力。一把梭之后发现必然返回403 Forbidden, 我直接在target里面填上游服务实例ip就可以正确返回。给一个向代理百度官网的简化示例,大家可以体会一下:packagemainimport("fmt""log""net/htt...
2022-08-29 08:21:13
1255
原创 自古以来,代理程序都是兵家折戟之地
反向代理的血案前几天打算使用golang做一个代理程序,golang标准库net/http/httputil已经提供了这样的能力。代理的是入站请求,应为反向代理,一把梭之后发现必然返回403 Forbidden, 我直接在target里面填上游服务实例ip就可以正确返回。给一个向代理百度官网的简化示例,大家可以体会一下:packagemainimport("fmt""l...
2022-08-29 08:21:13
148
原创 使用curl指令发起websocket请求
昨日的文章没指出websocket请求协商切换的精髓,删除重发。前文相关:•.NET WebSockets 核心原理初体验[1]•SignalR 从开发到生产部署避坑指南[2]tag:浏览器--->nginx--> server其中提到nginx默认不会为客户端转发Upgrade、Connection标头[3], 因为为了让被代理的后端服务器知道客户端要升级协议,故要在nginx上...
2022-08-08 13:17:50
8039
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人