一、故事背景
之前,写过一个故事《深入浅出:系统以前不慢啊?》,目的是把工作中遇到的一些经验总结下来。
这次,为加深自己对“分布式计算”的理解,用于今后的系统架构设计,支撑业务发展,就用同样的讲故事的方式总结如下。
二、故事开始了...
沿用上一集《深入浅出:系统以前不慢啊?》的故事背景,佟掌柜开的“下午来”书店生意规模确实比以前大了不少,但这两个月的销售额基本持平,不再增长了...
2.1 新业务模式
书店每月的销售额不再增长,一定是遇到了什么瓶颈!佟掌柜立马出发向虫大请教。
佟掌柜:请问如何进一步提高销售额呢?
虫大:坐等顾客上门已经不够了,是时候搞促销活动了!
佟掌柜:为什么促销活动可以进一步提高销售额?
虫大:因为促销可以通过优惠、折扣或赠品等手段,激发消费者的购买欲望,还可以吸引潜在用户,有助于商家在短期内快速回笼资金,提升业绩。
佟掌柜:这太好了!
虫大:不仅如此,促销也是商家进行品牌宣传和市场推广的有效手段。更高的知名度,有助于销售业绩持续不断地增长。
2.2 抡起膀子开干
找到了“杀手锏”,佟掌柜马上召集5大金刚(白展堂、莫小贝、郭芙蓉、吕秀才、李大嘴)开会,策划在中秋节开展促销活动。
促销活动方案
- 中秋节当天“下午来”所有门店卖书一律三折。
- 把促销消息公示在城里所有的告示牌上,同时让邢铺头(有偿)发动所有捕快广而告之。
- 为了客户满意,当天下单必须当天送货。
- 为了“下午来”的品牌价值,决不能对书虫们说不。
促销活动分工
- 莫小贝、郭芙蓉、李大嘴分别坐镇3个分店,只收单,不发货(因为分店小,货不全、量不足);
- 佟掌柜亲自坐镇总店,汇总所有门店的订单,并按收单时间排序;
- 白展堂轻功好,按顺序取得订单后,到仓库取货、然后送货给客户;
- 吕秀才做事仔细,坐镇仓库,根据订单出货给白展堂。
促销活动流程
看到大家参与如此热情、部署如此周密,佟掌柜想:这个月的销售额一定会翻倍的!!!
2.3 额滴个乖乖!!!
终于中秋节到了。一大早,“下午来”各门店就排满了人,9点一到书虫们就涌进店内开始下单。各门店也按促销流程把订单发送给佟掌柜进行汇总、排序。
看到几分钟不到就收到了平时一天的订单量,佟掌柜高兴极了,暗呼一声:“额滴个乖乖!老白马上按订单送货!”
可没过多久,佟掌柜就发现了不对劲,因为她看到桌子上已经排好序、待处理的订单已堆满了。白展堂轻功再好,一个人也忙不赢啊!照这样下去,显然不可能做到“当天下单必须当天送货”。
佟掌柜想到捕快们的腿脚也利索,立马联系邢捕头。
佟掌柜:老邢,赶紧给我安排几个人!
邢捕头:怎么了?佟掌柜:就是“下午来”中秋促销活动,订单太多了,要加派人手送货!
邢捕头:行啊,掌柜的,我马上安排燕小六、姬无命、殷十三,腿脚费你可要给够喽。
新的人手加入后,订单处理速度快了许多,虽然还是赶不上新订单增量,但好歹是个赚钱的生意,得接住这泼天的财富!
但紧接着,佟掌柜接到越来越多的不利消息:
- 书虫甲下单后一直没收到货,比他晚下单的书虫乙都收到了。
- 书虫丙买了三本不同的书,但收到的三本书是完全相同的。
- 还有一大帮书虫嚷嚷着赶紧送货,等不及了。
佟掌柜一边继续给新订单排序,一边联系各大金刚询问原因:
佟掌柜:什么!燕小六把送货的业务转包给他七舅姥爷啦!那个老头子还能跑腿?!(服务器太老旧)
佟掌柜:什么!姬无命翻越了几座大山后,才发现前方是绝壁?!(网络卡顿、断线)
佟掌柜:什么!殷十三送货路上被车撞到水里漂走了?!(程序意外崩溃)
佟掌柜:什么!因为七舅姥爷没有及时更新订单,所以白展堂又送了相同的书?!就是觉得吕秀才认真才安排他配货,喊他回话为什么不检查重复订单?
佟掌柜:什么!吕秀才身子骨太弱,已经扛不住配货压力晕倒了?!正在抢救?!(服务重启)
佟掌柜:什么!书虫丁等不及已经退货了,但白展堂还在在给他送书的路上?!赶赶...赶紧让他停下!(杀死进程)
佟掌柜冷汗直冒:“额滴个乖乖!各门店注意,请马上停止接新订单。”
2.4 究竟是怎么回事?
接下来,佟掌柜给还未收到货的书虫们致歉、承诺一定送到。并和5大金刚们开始通宵达旦地处理剩下的订单,核对造成的损失。
善后工作忙完后,佟掌柜做了个事件过程的记录,又来请教虫大。
虫大:嗯,促销活动前期宣传很好,业务流程也很清晰。但你们经验不足,没有遵守“CAP定理”。
佟掌柜:请解释一下。
虫大:中秋促销活动的业务依托三个系统来完成,即:门店系统、订单系统、仓储系统。所以,这是一个“分布式计算”的场景,要考虑三个核心需求:
- C = Consistency 一致性,是指所有的子系统、程序在同一时间点看到的数据都是相同的。
- A = Availability 可用性,是指不管是否成功,确保每一个请求都能接收到响应。
- P = Partition Tolerance 分区容错性,是指系统任意分区后,哪怕在网络故障时,仍能正常操作。
在分布式计算场景下,同时满足“一致性、可用性、分区容错性”是不可能的(有兴趣的可以去查阅相关证明),只能同时满足两个需求:
- 满足CA:就是放弃分区容错性,举例来说,就是让书虫们在各个门店完成“下单+取货”的完整业务。
- 满足CP:就是放弃可用性,举例来说,就是告诉书虫们现在忙不赢了,请稍后再试或下回再来。
- 满足AP:就是放弃强一致性,但可以追求最终一致性。举例来说,就是告诉书虫们下单后不能马上到货,预计3~5天到货。
虫大:CA、CP、AP,有各自的不足和特点,可以根据业务需求、投入产出,来评估选用哪种模式,它们都可以规避分布式计算场景下意外故障造成的损失。
佟掌柜:我好像明白了...
2.5 那还干不干?!
佟掌柜回去和5大金刚们分享了“分布式计算、CAP定理”。
白展堂:也许是最近通宵达旦的送货,我是听的头晕脑胀的。不能同时满足“一致性、可用性、分区容错性”,那咱们下次别搞促销活动了吧,费力不讨好呀!
佟掌柜:大家确实辛苦了,但我们迈出了关键一步,不能浪费宝贵的经验,遇到挫折就退缩了。虫大说了,可以根据业务需求、投入产出,来选用合适的模式。比如...
莫小贝:比如“秒杀”活动,可以用CP。反正抢到就得,抢不到就拉倒。
郭芙蓉:比如我们能够提前备货到各个门店,就可以用CA。但要考虑备货成本、货品安全(数据安全)、售后对账。
李大嘴:如果在资源不足(投入有限)时我们仍然想接到大量的订单,且用户“想买到爆品”的心情能容忍“延迟发货”,就可以用AP。只要不出差错,用户就不会抱怨。
佟掌柜:恭喜你们,都学会抢答了!
吕秀才:其实,中秋促销活动来了那么多书虫,证明我们有好的创意和产品,也收到了大量订单。作为账房先生,我觉得“能够创收、增大销售额”,这么好的事情就应该继续做下去。
佟掌柜:总结经验、完善业务,干就完了!!!
三、故事讲完了
也许这个故事不那么完美,但深入浅出地说明了在分布式系统面对大并发量的情景下,技术应该如何与业务联动,达到促销的目标。
所有公司最大的风险是停业破产,各个部门都应该想法设法帮助公司存活下去。在互联网时代,如果没有IT部门的参与,大部分市场营销项目将无法实现,个性化的市场营销尤其需要高科技的支撑。
一个伟大的团队并不代表他们拥有最聪明的人。使团队变得伟大的因素,是每个人都互相信任。当那种神奇的动力出现,就会让整个团队充满力量。
IT不只是一个部门,为了实现战略目标,IT是在整个公司层面都需要发展的一种能力。