
1066年,自维京入侵英国以来已经过去了200多年。 哈罗德国王征集了一支骑士团,与德意志特河一起同他的同名部队-挪威国王哈拉尔德展开决定性的战斗。 枪匠工作了一个月,以制造出足够数量的新一代装甲,以保护骑士免受斯堪的纳维亚斧头的袭击。 以及之前在锦标赛中进行过多少次实验和试验! 但是人们的期望应该是合理的-轻便但可靠的设备即使没有大的损失,也可以步行行走,以驱散维京人。 最后,他们在斯坦福桥见面。 一支由身穿闪亮盔甲的指挥官领导的骑士团在与敌人的桥中间发生冲突。 是的,Podgorny大师的精湛铸功!
缓慢但可以肯定的是,维京人正在转向循环防御。 胜利似乎快到了。 最后,在战场上,骑士指挥官和挪威jarl互相找到了。
两只手的贾尔(Jarl)的斧头已经断掉,他被迫用普通的撒克逊人为自己辩护,这无法与骑士半剑相提并论。 挥舞着匕首-对于指挥官的盔甲来说,就像一把小刀,但是它穿过了盔甲,而且……似乎已经发挥了魔力-周围骑士的盔甲散落了! 另一波又一次对准了目标,现在在左翼的骑士身上,装甲突然发红。 第三击-骑士在他们眼前游泳,跌倒,跌倒,再也没有站起来。
“ *** ** **** ****!” 哭泣的彼得罗维奇(Citro Petrovich)在周一的凌晨5点醒来,汗流cold背。 一切都完全出错了:晚上11点,他爬入Wikipedia,寻找有关该孩子有关苔原性质的报道的资料,但到了深夜,他却以某种方式发现了维京人入侵英格兰的描述。 并且,在周末,他们将与下一个版本进行较量,该版本应于今天开始。 与往常一样,我们进行了长时间的彻底测试,使它通过连续集成系统运行了百万次,无论一切是否顺利……
对于某些人来说是幸运的,但对于受害者来说不幸的是,总是有机会学习其他人的错误,在家中做点改善,并获得更多的信心。 我们希望通过这篇翻译过的文章再次更详细地回顾“我们”行业中的一种情况。
去年在会议上,我谈到了DevOps,代码配置和持续交付。 在下面的故事中,我解释了作为DevOps / Continuous Delivery计划的一部分,创建完全自动化且可复制的部署的重要性。 会议结束后,几个人要我在博客上分享一个故事。 这是一个绝对真实的故事。 这是我读过的书,我本人没有参加。
因此,有关一家资产近4亿美元的公司如何因部署不成功而在45分钟内破产的故事。
一点背景
骑士资本集团(Knight Capital Group)是一家美国的全球金融公司,从事做市,电子执行,机构销售和交易。 2012年,Knight是美国最大的股票交易商,在纽约证券交易所和纳斯达克市场的份额约为17%。 奈特电子贸易集团(ETG)每天平均每日交易量超过33亿笔交易,每天交易额超过210亿美元。 这不是在开玩笑!
截至2012年7月31日,奈特拥有约3.65亿美元的现金和现金等价物。
2012年8月1日,纽约证券交易所计划启动一项新的零售流动性计划,即零售流动性计划(旨在通过零售经纪人(例如Knight)提高零售投资者定价的计划)。 为准备该活动,Knight更新了他们的自动高速算法路由器SMARS,该路由器将应用程序发送到市场以执行。 SMARS的主要功能之一是从Knights交易平台的其他组件(“父”应用程序)接收应用程序,然后发送一个或多个“子”应用程序以执行。 换句话说,SMARS将收到来自交易平台的大订单,并将其分解为几个小订单,以寻找股票的买卖双方。 父应用程序越大,将创建的子应用程序越多。
SMARS更新本来应该替换称为“ Power Peg”的未使用的旧代码-骑士已经8年没有使用此功能了(为什么已经死了很长时间的代码仍在代码库中是一个谜,但这不是主要内容)。 更新的代码重新分配了用于激活Power Peg功能的旧标记。 该代码已经过全面测试,正确运行并且可靠。 可能出了什么问题?
可能出了什么问题? 真的!
在2012年7月27日至2012年7月31日之间,Knight每天在数量有限的服务器上手动部署新软件-总共八(8)台服务器。 这是
SEC文件关于手动部署的内容(SEC是美国股票市场监管机构美国证券交易委员会)。
“在部署新代码期间,一名Knight员工没有将新代码复制到八台SMARS服务器之一。 Knight没有对该部署进行第二次技术审查,因此未从第八台服务器中删除Power Peg代码,并且未添加新的RLP代码。 该公司没有适当的程序要求重新检查。” 版本号70694,2013年10月16日
2012年8月1日,美国东部时间上午9:30,市场开放,奈特开始在新的零售流动性计划中代表其客户处理经纪交易商的请求。 正确部署的七(7)台服务器开始正确处理应用程序。 那些进入第八台服务器的应用程序可能激活了已更改的标志并恢复了Power Peg。
僵尸攻击:杀手级密码
在这里,您需要解释为什么需要“死”的Power Peg代码。 此功能旨在计算孩子的订单完成后应父母的要求买卖的股票。 执行父应用程序后,Power Peg禁止提交子应用程序。 原则上,Power Peg将跟踪子订单并在处理父应用程序后停止其执行。 在2005年,Knight将这种累积跟踪功能回滚到了代码执行的早期阶段(因此从Power Peg中删除了数量跟踪)。
当第八台服务器上的Power Peg标志被激活时,Power Peg开始路由子订单以执行,但没有将它们与父订单中的份额数量相关联-出现了一种闭环
地狱45分钟
想象一下:您有一个系统可以将自动高速应用程序发送到市场,而无需进行任何跟踪,并且可以查看是否已完成足够的应用程序。 是的,一切都变得如此糟糕。
当市场在上午9:30开市时,人们很快意识到出了点问题。 到上午9:31,华尔街上的许多人已经意识到发生了严重的事情。 与正常情况相比,某些股票的交易量充斥着异常的买价。 在华尔街9:32之前,他们想知道为什么这种耻辱感不会停止。 几乎永远都是高速交易。 为什么没有人单击执行该操作的系统上的“杀死”按钮? 事实证明,没有任何开关。 在交易的前45分钟内,来自Knight的交易执行量占交易量的50%以上,从而使某些股票的价值增加了10%以上。 结果,其他股票由于交易错误而贬值。
更糟糕的是,甚至在这些事件发生之前,骑士系统就开始发送自动电子邮件-最早在上午8:01(当SMARS处理适合于盘前交易的订单时)。 在消息中,系统引用了SMARS,并显示错误“电源钉不可用”。 在上午8:01到上午9:30之间,向Knight员工发送了97封信。 当然,这些字母看起来不像系统警告,因此没有人立即看它们。 哎呀
在地狱的45分钟里,奈特试图阻止错误的交易。 无法关闭该系统(因为没有针对这种情况的书面记录的程序),因此,为了解决实时交易条件下的问题,它们仍然留在市场中,每分钟出售800万股。 由于公司的员工无法确定错误应用程序的来源,因此他们从正确部署新服务器的服务器上删除了新代码。 换句话说,他们删除了工作代码,然后中断了工作。 这只会加剧导致额外父母请求来激活所有服务器上的Power Peg代码的问题,而不仅是最初错误地部署代码的地方。 最后,在交易45分钟后,我设法停止了系统。
在进行交易时,Power Peg代码收到并处理了212个父母请求。 结果,SMARS向市场发送了数百万个子公司,在154笔交易中完成了400万笔交易,股份总数超过3.97亿股。 对于股票行家来说,这意味着奈特斥资35亿美元购买了80家不同公司的股票,并以31.5亿美元出售了74家公司的股票;从非专业人士的角度来看,奈特资本集团在45分钟内亏损了4.6亿美元。 但是奈特只有3.65亿美元的现金和现金等价物。 在45分钟内,奈特从最大的美国股票交易商以及纽约证券交易所和纳斯达克的主要做市商转变为破产。 他们有48小时的时间来收集弥补损失所需的金额(这要归功于大约六位投资者的4亿美元投资)。 最终,骑士资本集团(Knight Capital Group)被Getco LLC(2012年12月)收购,现在合并后的公司称为KCG Holdings。
您需要得出什么结论
对于所有开发团队和项目团队而言,2012年8月1日的事件应该是一个教训。 仅仅创建出色的软件并对其进行测试还不够。 您还需要确保将其正确地投放到市场上,以便您的客户准确地获得您提供的价值(并且您不会使公司破产)。 部署SMARS的工程师不仅要怪这样一个事实,那就是Knight所遵循的程序没有考虑到风险。 该过程(或其不存在)显然是错误的。 每次部署过程取决于人们如何阅读和遵循说明时,都会使自己面临风险。 人们会犯错误。 错误可以出现在指令中,指令的解释中或执行中。
布局应是自动化的,可复制的,并且应尽可能避免人为错误。 如果Knight实施了自动部署系统(一套配置,自动部署和测试),则可以避免导致Knight噩梦的错误。
以下是连续交付的几个原则(即使您没有实现连续交付的完整过程):
- 软件发布应该是一个可重复且可靠的过程。
- 自动化一切。