Redis Sorted Sets 实现跨境电商业务订单抢占库存

历史逻辑是:收到订单,过风控Check…,查库存,占库存,有货就下发到物流渠道;否则就处于缺货的等待状态。 这么简单的流程我就不画图示意了。 这种模式,有一个弊端:假如有热卖的产品一直“爆单”,而库存不足的话,会导致先进来的订单一直卡在缺货。 原本一来货,它就应该满足库存标准,按照订单应发数量占住库存,然后下发的。这一直被后来的订单抢走了库存! 所以问题的解决结果可以明确为:先来的订单需要抢占SKU库存,后来的订单sku缺货就排队等待。 我们小组拉个会议室,对着白板,边画边展开一番解决方案讨论。一开始Leader 提议使用小顶堆。新订单进来,重新进行堆排序。让最早的订单排在小顶堆堆顶。 但是我对用Go实现一个切合当前业务的小顶堆,有点耗时间。然后我一想,这个缺货的判断你要一直持久判断,用小顶堆,持久性你怎么保存?而产品又只给了2天的开发时间,测试一天,然后就要发版。我直接说,还不如用 Redis Sorted Sets 来实现。 大家你一句,我一句。一致同意了这个大方向的技术方案。 具体到详细的方案执行上,把订单的创建时间作为有序集合成员的分值score,将订单号加上一个专属的前缀拼接成具有清晰表意的 member 值。再给一个特殊的字符串作为集合的 Key 值。这样数据结构的设计明确下来。 具体调用的业务逻辑,新单生成,进行库存查询时,先根据订单创建时间作为 max score 值,判断一下这个有序集合是不是有 member。 如果有,那就将当前订单也加入到有序集合里来。 如果没有,那么说明前面没有更早的缺货订单,就直接查库存。 查库存结果,有两种结果。若是发现有缺货,那么也还加入缺货有序集合,如果有货直接占用库存,紧接着发到物流渠道。 另外一种场景就是,采购或者订单已占用库存的订单作废,释放库存出来。这个时候相当于库存有增加,那么可以通过另一个队列触发这个来货的 sku 队列,走一样的逻辑去遍历缺货的订单 Zset,按照不缺货的先创建的订单占用库存。 当然实际业务,要比这个要复杂的多。这里只是隐匿了诸多具体业务,抽取核心技术实现点进行说明。 这样,无论怎么来订单,库存怎么变化,最后,占用库存的流转开关都交给了 Redis Sorted Sets 把控。保证了先创建的订单先占库存。 跨境电商商户也就不用担心一些爆款产品热卖,先下的缺货订单因临时库存不足,迟迟未发货遭客户投诉而被 Paypal 等支付平台冻结资金了。

mysql task_log.ibd 文件占用大量磁盘空间引发的血案

早起访问 gitvim.com , logo出来了,但是首页内容一直是空白的,F12 打开看加载完了,但是我这网站怎么挂啦?没有一丁点页面文字? 快速排查日志, 先查 nginx 日志 tail -f /var/log/nginx/error.log 发现 Nginx 错误日志是空的,这说明业务服务器没有问题。但是在这里敲命令的过程中,发现 tab 键失效了,一直弹出来 [root@api nginx]# less ac-bash: cannot create temp file for here-document: No space left on device 一开始我没太在意,以为是自己的键盘快捷键重合导致的。然后继续排查 Nginx 访问日志。 [root@api nginx]# less ac-bash: cannot create temp file for here-document: No space left on device tail -f /var/log/nginx/access.log 一看,也是空的。也没啥毛病。我就纳闷了,难道是 PHP …

mysql task_log.ibd 文件占用大量磁盘空间引发的血案 Read More »

golang echo framework 跨域

浏览器 跨域 问题在互联网中似乎是非常普遍的问题,但是我是最近才遇到需要自己亲自解决这种场景。先说结论:可以在 Nginx 层或者后端服务中间件层针对 Options 的 Http Method 进行设置,可以解决掉这个问题。我这边是通过 Nginx 层和 Golang echo 框架两个地方合力解决的,同时和云服务器的负载均衡也有一个很关键的关联。从实际出发,将遇到的问题做一个小结,归纳 细说从头,最近开发一个文件上传的服务,大批量的商品文件信息需要从客户端上传到我们后端系统中。但是我们业务系统带宽和磁盘空间不太够,所以购买了阿里云 OSS 服务,要将文件上传到 OSS 中。仅将部分文件信息如文件名,访问地址链接,文件类型,上传记录等信息保存在我们业务系统中。 去听了需求设计方案,说是要用直接上传的方案。我研究了一下有两套常用的 Web 上传 OSS 方案。不过最后采用的是短平快的 A 方案,文章结尾还有一个最优的 B 方案。 一顿操作猛如虎,CURD 完了之后,单元测试一遍,集成测试也走一遍,在 Postman 上模拟了所有相关的接口请求,如预期所愿。Perfect!  程序员最大都欣慰就是:我的程序测试都过了,跑起来没问题。 接着就开始部署到测试环境联调。我还在高兴地转手去写几行 Rust 代码,然后联调到业务方同事就发来高能预警,说不能访问,请求文件上传的接口没有返回。要来 URL 地址和请求参数,我自己在本地重现。F12 查看网络请求,发起POST 请求之前,浏览器会多发一个Options 的请求。【 跨域 】 的幺蛾子问题就这样冒出来了。 Referrer Policy: strict-origin-when-cross-origin Access-Control-Allow-Origin … 我是 a.test.com 的域名,而发起文件上传的服务域名是 b.test.com。当 b.test.com …

golang echo framework 跨域 Read More »

秒杀场景 -我有一个想法

秒杀场景 思考理解(2021)   秒杀场景 即使看过无数遍相关的处理方法,还是会忘,因为没有真正实战过,总得抽时间总结一下这个场景的应对策略。那天就需要处理这块业务呢?以防一般的 bug 在那时顶风作案。秒杀场景通常发生在活动日, 节假日促销,”双十一”, 春运火车票抢购等. 此时, 一般是月黑风高, Bug 容易趁机做乱之时。秒杀开始之前,先来欣赏一段【亮剑】李云龙攻打县城的场景, 当时日方从四面八方往平安县城增援时, 丁伟所在的防区的阻击方式很是巧妙:   一开始没搞懂增援的敌人是干啥时, 丁伟的策略是: “一线部队放过敌人的骑兵, 全力阻击敌人的步兵, 二线部队务将敌人的骑兵拦截在二道河口”. 然后发现敌人不顾一切地要奔赴县城时,他明白了,这伙部队是下了死命令往县城奔啊!如果硬抗,肯定是伤亡惨重啊,但是又不能撤出部队,让敌军从防区里过去.亮点来了, 下了四道命令: 1. 发动地方武装和民兵, 沿公路线及公路两侧埋设地雷, 密度要大; 2. 派出小部队,占据公路沿线的隘口和制高点, 节节抗击.迟缓敌人的进攻锋芒; 3. 炸毁防区内所有的桥梁; 4. 前沿部队撤出阵地,让开路口,让敌人进来.采用麻雀战,袭扰敌人. “原则就只有一个,不惜一切代价,阻敌增援.” 这不就是活生生的秒杀现场吗!下单的人就是”日军”,不顾死活的都狂点狂刷剩下的库存, 提交表单, 奔赴”县城(数据库)”! 买!买!买!但是你说我网站能让你轻易从我”防区”过去么?那么怎么阻击经过我秒杀系统的场景"防区"呢?或者说怎么设计和优化我防区的阻击能力呢? 【秒杀场景】现场特点   1. 大量用户在同一时间发起进攻, 造成瞬时的高流量. 2. 访问量远远大于库存量. 3. 业务流程就是下单并减库存. 针对性的架构   秒杀页面->服务器站点->服务层->数据库层 秒杀页面 1. 静态化,在秒杀页面,就得将页面静态化, 除了必要的静态元素,其余的全部静态化,结合 CDN抵抗页面静态元素的访问. 2. …

秒杀场景 -我有一个想法 Read More »

awk linux command 命令是一把瑞士军刀

awk linux命令中的一把瑞士军刀 – awk 可以号称为Linux命令行工具的屠龙刀- 编程开发, 网络,移动互联网,云原生,微服务,K8s, Docker, Rust, Golang,做自由独立开发。独立开发过小程序,搭建网站,运维,熟悉Linux操作系统,现在正在做基于WooCommerce的跨境电商系统。

Emacs 漫步– org link

org-link emacs 内使用 Alt + X 调起 helm 界面。 helm 界面可以在输入模式下直接调起。不像vim。 输入org-link可以看到各种有关 org-mode 下 link 相关的操作。helm 非常友好,只要输入相关关键字的命令名称,就给列出来所有包含这个关键字的命令了。而且输入这些关键字查询的时候, 可以不分次序! org-mode 下的 link 是这样款式的 [[http://www.gnu.org/software/emacs/][GNU Emacs]], http://wowubuntu.com/markdown/, 大同小异。正常情况下 org-link 带有三个中括号,内部第一个中括号是链接地址,可以是文件路径,图片地址,http 超链接,第二个中括号是这个链接的描述,描述可以为空 如 [[http://www.gitvim.com]]。 列举几个常用的 link 操作: org-insert-link顾名思义, 添加一个带有链接和描述的超链接文案, 先输入 link, 然后是 description。 org-toggle-link-display可以切换 link 和 description 之间的显示, 方便修改描述和链接地址。 org-store-link用于…这个诡异 org-previous-link & org-next-link双胞胎, 前后跳转到链接的命令 官方也有相应的 org-link 使用方式 org-link小结 Emacs …

Emacs 漫步– org link Read More »