批量发货阻塞启示:深挖系统薄弱点

背景

最近发生了一起“批量发货阻塞”的线上问题,值得深思和记录。

批量发货的流程是:商家上传一个里面可能含有一万多的订单号及物流发货信息的发货文件,然后PHP后台接收和解析文件,提取出待发货的信息,每5000个订单号发货信息打包成一个消息后批量推送到NSQ消息队列中。后台PHP脚本从NSQ消息队列中取出打包的发货消息,打散成单个的发货消息,然后循环调用Java发货服务化接口完成批量发货。

这里采用5000个订单号发货信息打包一个消息批量推送,是考虑到前端超时限制,采用其他数量总有偶发的前端超时,导致无法给出正确的提示。而为了简单起见,PHP采用了同步串行的方式。

事件

昨天,有客满同学报商家批量发货发不了货了。我意识到消息可能积压了。马上到NSQ平台查看,果然消息有堆积的现象。紧急联系NSQ同学帮忙查看,NSQ同学的答复是:消费客户端超时。

开始并不清楚究竟是什么原因,先采用加发货服务的机器、启动更多PHP进程来缓解问题,但是没有效果。 后来直接与NSQ交流知道,NSQ会对消费端进行计时,如果在指定时间内没有消费完数据,就会超时断链然后重发消息。5000个发货消息,每个消息处理100ms,也要 500s = 8min+,因此NSQ会反复断链然后重试,而PHP进程有限,导致消费端始终堆积。

最后采取的措施:先停掉NSQchannel,备份其中的消息数据;然后清空channel,手动对NSQchannel中的指定数据进行消费。

对NSQchannel中的指定数据进行分析后发现,里面有1700+订单连续重复发货了360+ 多次。联系商家说是,周期购发货需要一次性把这么多期全部发货完毕,客服点得手都累了。囧~~ 至此,原因基本清楚了: 一位周期购商家短时间内发货了600000+,而后台PHP脚本是循环调用服务化接口,没有那么大的吞吐量及时处理这么多的发货请求,导致消息一直超时、重试、堆积,形成恶性循环。

教训

  1. 对NSQ消息消费的技术细节不深入,消息处理代码在大批量发货请求下有BUG,导致消息超时、重试、堆积; 后来采用每隔一段时间传一次心跳,保持NSQ连接。启示:深入技术细节,知其所以然。
  2. 后台采用PHP循环调用请求,吞吐量低,在超大量并发发货的极端情形下无法应对, 系统薄弱点。改进方法: 直接在Java端多线程消费发货消息,正确处理消息ACK。依次类推,我们应当居安思危,多多深挖系统的薄弱点:单点、单线程、吞吐量低、无业务幂等、弱安全性、循环多次调用同一接口、无线程池控制的独立线程等。
时间: 2024-07-28 22:40:12

批量发货阻塞启示:深挖系统薄弱点的相关文章

深挖“窄带高清”的实现原理

过去几年,又拍云一直在点播.直播等视频应用方面潜心钻研,取得了不俗的成果.我们结合点播.直播.短视频等业务中的用户场景,推出了"省带宽.压成本"系列文章,从编码技术.网络架构等角度出发,结合又拍云的产品成果,向大家介绍节省流量,降低带宽成本的妙招. <降低30%视频码率,深挖"窄带高清"的实现原理>是"省带宽.压成本"系列文章的第3篇.本文将深挖又拍云最新技术窄带高清,讲解窄带高清是怎样在不改变视频主观质量的情况下,通过改变码率来降低

【转帖】深挖NUMA

深挖NUMA http://www.litrin.net/2017/10/31/深挖numa/ 首先列出本站之前相关的几篇帖子: Linux的NUMA机制 NUMA对性能的影响 cgroup的cpuset问题 这次,就来深入了解下NUMA. 就如之前说的,在若干年前,对于x86架构的计算机,那时的内存控制器还没有整合进CPU,所有内存的访问都需要通过北桥芯片来完成.此时的内存访问如下图所示,被称为UMA(uniform memory access, 一致性内存访问 ).这样的访问对于软件层面来说

深挖NUMA

首先列出本站之前相关的几篇帖子: Linux的NUMA机制 NUMA对性能的影响 cgroup的cpuset问题 这次,就来深入了解下NUMA. 就如之前说的,在若干年前,对于x86架构的计算机,那时的内存控制器还没有整合进CPU,所有内存的访问都需要通过北桥芯片来完成.此时的内存访问如下图所示,被称为UMA(uniform memory access, 一致性内存访问 ).这样的访问对于软件层面来说非常容易实现:总线模型保证了所有的内存访问是一致的,不必考虑由不同内存地址之前的差异. 之后的x

京东深挖物流,引领双十一理性消费

电商圈关于双十一的筹备工作已悉数完成,阿里与京东两大巨头的"猫狗大战"如期上演.近日关于两巨头双十一宣传海报相继问世,不再是来言去语式争风吃醋,而是各自风格迥异,黑白分明.而正是这种全然不同,吸引了笔者的注意:冲动消费已成过去,完善服务倡导理性回归. 消费结构趋向价值引导 随着社会消费结构的升级以及线上线下电商的相互融合,以价格战为主导的双十一已不再适合当下的消费需求.我国居民可支配收入的增加,中产阶级群体以超过一亿之多,加之长达八年双十一的消费洗礼,现在的消费不在看中价格,而偏向价值

美国联邦调查局FBI继续深挖大北农窃种行动的“内奸”

2013年12月12日,大北农"窃种行动"案件的经办人,Klinefeldt检察官在新闻发布会上表示,FBI要继续深挖那些暗藏在美国公司内部与中国大北农"窃种行动"同谋的"内奸"("insider"),正是这些"内奸"向大北农偷窃种子的执行者提供转基因玉米测试场地的具体所在位置以及相应的转基因玉米的基础遗传基因序列. 转基因玉米的基础遗传基因序列是绝对的商业秘密,涉及到国家的根本利益.在美国,转基因玉米的4

写作社群圈子牛人:矩阵不如深挖

不知大家对"矩阵"一词是否了解,它常用在数学中,是一个按照呈方形陈列排列的复数或实数集合.我发现不少人在发布文章的时候都会采用矩阵的方法,就是将一篇文章发10个,20个,甚至更多的平台,不管平台大小,只要是平台都会发到. 我的做法正好相反,不会将文章随便发到一个平台上.我的文章绝大部分都发布在阿里和慧聪网,其中又以阿里为重点,而且我不会将文章随意发到阿里的任何一个论坛.我的方向性很强,只发在一个论坛上,这一习惯已经保持了好几年.选择矩阵式的发布文章的人一直都很忙碌,他们到一个平台发完文

深挖JDK动态代理(二):JDK动态生成后的字节码分析

接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transClass() throws IOException { URL resource = rpcMain.class.getClass().getResource("/"); byte[] bts = ProxyGenerator.generateProxyClass("$Proxy0

深挖Openstack Nova - Scheduler调度策略

深挖Openstack Nova - Scheduler调度策略 一.  Scheduler的作用就是在创建实例(instance)时,为实例选择出合适的主机(host).这个过程分两步:过滤(Fliter)和计算权值(Weight) 1. 过滤: 过滤掉不符合我们的要求,或镜像要求(比如物理节点不支持64bit,物理节点不支持Vmware EXi等)的主机,留下符合过滤算法的主机集合. 2. 计算权值 通过指定的权值计算算法,计算在某物理节点上申请这个虚机所必须的消耗cost.物理节点越不适合

任务7,深挖K近邻

任务7 深挖K近邻 一, 缺失值的处理 处理缺失值的方法:需要理解数据,察觉到哪些数据是必要的哪些不必要 1, 删除法: (1)     删整个列 (2)     删整行(丢弃此记录) 2, 填补法 (1)     用平均值来填补缺失值 (2)     均值,中位数填补 二,特征编码 ——机器学习的核心是建模,基础是数据,且输入一定是数值类型的,因此要把字符串转为字符类型,向量或矩阵类型 ——这个转换的过程叫类别特征 ——最常用的编码技术叫 独热编码 对于标签编码,用0,1,2表示特征的取值,但