时间序列数据库怎么处理电商订单

Posted by Zeusro on September 7, 2020

一道面试题

最近我在面试。有一次,面试官问了我一个电商秒杀的问题。

对于这个问题,无论前端如何耍猴(比如像以前小米页面弄个无限loading),怎么各种分布式消息队列,多级缓存,读写分离。到最后都会发现,数据库都会是最大的瓶颈。

淘宝商城的双十一搞了很多年,但说实话,每年都崩。也就是说,连支付宝这么优秀的团队,服务可用性也是有上限的。

(非)关系型数据库的解决方案

基本上都是数据库读写分离+乐观锁 or 悲观锁 的选择。

如果用乐观锁,那么尽量让实时数据流引擎(消息队列消费者)在尽可能短的时间内砍掉无效的订单。尽可能让用户在下单与付款之间过滤掉无效的订单。 俗称砍单。

如果用悲观锁,那么瓶颈必定是库存那部分的计算。对于这部分频繁更改的数据,建议走 Redis + 定期落盘。Redis 本身可以集群化,这样就可以最大程度地规避可用性问题。

土豪的解决方案

12306选择了 Pivotal GemFire分布式内存计算平台(Distributed In-memory computing)。

那么,用时间序列数据库怎么处理电商订单?

时间序列数据库的解决方案

在我之前写的文章中,我确立了不可变性作为时间序列数据库的第一属性。也就是说,对于时间序列数据库而言,只有 create 和 query ,没有 update 和 delete 。

那么,所有的数据,在时间序列数据库中都是一种状态机一般的存在。

比如商品库存表长这样:

date goodID count
2020-09-07 16:00 3 1
2020-09-07 16:01 3 0

订单长这一样子:

date orderID userID goodID status
2020-09-07 16:01 1 2 3 已下单
2020-09-07 16:02 1 2 3 已付款

数据库本身只是一个加了索引的表,写入之后记录不可变,数据库本身通过不变应万变。

事务靠实时数据流分析引擎去实现

在库存运算方面,我建议这部分数据放内存里面,然后靠实时数据流分析引擎完成计算完事务后,再落盘时间序列数据库。也就是说,时间序列数据库存的是既定的结果

不过关于这一块内容,以上只是一种设想。欢迎大家给我留言,一起讨论。

进一步思考

其实,与其用复杂的技术实现,还不如重新设计一个流程,规避超大并发的问题。

像后来天猫的双十一,前期会有一些锁定定金的订单,这些订单的支付时间是在1点之后,也就是说,从活动设计之初,我们就尽可能地错开了0点秒杀这个流量峰值。 这是一种时间换空间的做法。

结论

能够用钱解决的问题都不是问题。

参考链接

[1] 12306网站:分布式内存数据技术为查询提速75倍 https://cloud.tencent.com/developer/article/1074220

[2] 时间序列数据库的重要性 https://zhuanlan.zhihu.com/p/122145626

[3] 时间序列数据库才是未来 http://www.zeusro.com/2020/04/02/tsdb/

[4] 电商网站中,50W-100W高并发,秒杀功能是怎么实现的? - 九章算法的回答 - 知乎 https://www.zhihu.com/question/20978066/answer/1415294056

[5]

[6]