电商系统设计MySQL_电商系统中的下单功能的mysql架构设计
简单的订单业务的基本模型设计用户、商品(库存)、订单、付款,这里只考虑商品和订单,流程是下订单 -> 减库存,这两步必须同时完成,不能下了订单不减库存(超卖),或者减了库存没有生成订单(少卖)。超卖商家库存不足,消费者下了单买不到东西,体验不好;少卖商家库存积压或者需要反复修改商品信息,反复麻烦,体验也不好。
在系统初期,承接流量小,很多创业团队都是单库的模型(是的,大家都在一起。。。)。这种模型带来了极大的方便,不用跨库,更没有跨节点,能够方便的利用数据库提供的事务来实现下单和减库存的原子操作,还能进行各种联表和子查询(运营MM需求再变态,我会SQL能奈我何)。但也正是这些优点,会成为流量上来后对系统进行扩展的绊脚石。联表、子查询、事务都是将多张表绑定在了一起,拆库、拆表就麻烦了。
后期系统流量逐渐升高,单库的读写性能不够,这时候会考虑将数据库进行拆库、分表。比如商品和订单分为两个集群,集群内又根据各自业务维度进行分库和分表,商品可以根据卖家维度来切分,订单一般根据买家维度切分,并且根据卖家维度做冗余。这个时候出现的问题,还是经典问题——数据一致性,数据拆分后商品和订单不在一个库里,怎么保证一致性;买家维度的订单数据怎么和卖家维度的订单数据保证一致性。有两个解决思路:
(1)分布式事务,经典的有基于2PC的实现。优点是封装得足够好后使用起来和单库虽然有区别(主要是复杂查询语句),但总体来说对业务的改动不会很大。缺点是性能太差,本来引入分布式数据库主要是为了成倍的提高性能,但因为分布式事务的引入将这个性能的提升大打折扣,很多时候这个性能是难以接受的。
(2)消息中间件,本文主角,消息中间件的一大职能就是负责各个系统间的交流,非常适合这里的商品和订单系统的同步问题。引入消息中间件后的下单流程是:用户A下订单后给消息中间件发送消息,商品系统订阅订单消息,并扣除相应的库存。
这里有几个注意点:
a、消息的传递是需要时间的,下单前查看有库存,但在并发条件下,实际减库存时可能库存不够,所以必须在库存扣减成功后才能显示订单成功,即下单后标记已下单,但用户对该状态不可见,等待商品系统减库存成功后,再通知订单系统更新状态(仍然是消息中间件的运用哦);
b、对消息的可靠性要求很高,发送消息时返回成功就要保证该消息会被投递,发送失败需要下单业务自己做回滚;
c、消息的可靠性高表示一定会有消息重复,这里需要商品系统自己做幂等,可以通过消息id来做去重,否则会少卖;
d、下单成功失败前端用户都希望尽早得到通知,所以在下单成功后需要设定一个定时消息,在一段时间后如果订单库存还没有扣除成功,这个时候应该通知用户下单失败,并且定期回补这部分多扣的库存。
引入消息中间件,可以很好的解决了分布式数据库数据同步的问题,避免了分布式事务。并且额外的好处是减少了减库存时候的并发锁争抢,性能杠杠的。
相关标签:mysql
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
电商系统设计MySQL_电商系统中的下单功能的mysql架构设计相关推荐
- 电商系统中的商品模型的分析与设计—续
在<电商系统中的商品模型的分析与设计>中,对电商系统商品模型有一个粗浅的描述,后来有博友对货品和商品的区别以及属性有一些疑问.我也对此做一些研究,再次简单的对商品模型做一个介绍. 从SPU ...
- linux中bash的功能主要有,Linux系统中的Bash功能的介绍
今天小编要跟大家分享的文章是关于Linux系统中的Bash功能的介绍.一个完整计算机的体系结构包括:硬件与软件,而软件又分为系统软件与应用软件,负责对硬件仅需管理与操作的是系统软件的内核部分,用户是无 ...
- 现代IM系统中消息推送和存储架构的实现
摘要: 前言 IM全称是『Instant Messaging』,中文名是即时通讯.在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉.微信.QQ等以IM为核心功能的产品 ...
- 消息已读未读的模型设计_阿里云技术专家分享:现代 IM 系统中消息推送和存储架构的实现...
前言 IM 全称是"Instant Messaging",中文名是即时通讯.在这个高度信息化的移动互联网时代,生活中 IM 类产品已经成为必备品,比较有名的如钉钉.微信.QQ 等以 ...
- command在计算机中的意义,MAC系统中Command键功能有哪些
这篇文章主要介绍了MAC系统中Command键功能有哪些,,需要的朋友可以参考下 Mac苹果电脑的Command键位于空格边上,相信大家都会很经常用到的,不过,你知道Command键有哪些其他功能吗? ...
- win7关闭系统索引服务器,如何关闭Windows7系统中的索引功能
Windows7系统中的索引功能有什么作用?简单的说就是为系统的文件等内容提供索引和搜索结果,一般很少用到,而且还占用一定的系统资源,如果你发觉你的系统越来越慢,可通过关闭索引功能. 如何关闭Wind ...
- 【Android笔记67】Android之使用系统中的相机功能(拍照、保存照片、显示拍摄的照片、照片保存到图库等操作)
这篇文章,主要介绍Android如何使用系统中的相机功能(拍照.保存照片.显示拍摄的照片.照片保存到图库等操作). 目录 一.使用Android相机功能 1.1.如何调用相机功能 1.2.调用相机功能
- 阳光旅行网app中用户下单功能,《使用Java实现面向对象编程》内部测试机试题
一.语言和环境 A.实现语言 Java B.环境要求 MyEclipse 10 二.功能要求 开发阳光旅行网app中用户下单功能,可实现用户添加订单并完善出行人信息.修改订单,删除订单以及打印行程信息 ...
- 高并发、高性能下的 会员系统[同程艺龙] — 高可用架构设计实践
目录 会员系统[同程艺龙] - 高可用架构设计实践 ES高可用方案 ES双中心主备集群架构 ES流量隔离三集群架构 ES集群深度优化提升 会员Redis缓存方案 Redis双中心多集群架构 高可用会员 ...
最新文章
- 快速启动神器 Wox
- 【Codevs1322】单词矩阵
- php nodejs 前台,NodeJS之前端注册页面
- 【Python教程】读写ini配置文件的详细操作
- 如何在单个测试中同时执行多个断言
- 学习程序开发的方法,仅供参考吧
- Redis事务深入解析和使用
- OpenERP 中的on_change方法总结
- 微信小程序 data中数据值的更改与储存
- 20190905每日一句
- cacti不能实时刷新流量图_解决Cacti无法正常监视超过100M以上流量的问题
- app移动接口开发需要注意什么
- OpenV2X开源社区亮相全球边缘计算大会
- 在线matlab,亲测好用
- MP4-M3U8在线P2P加速视频播放器PHP源码
- 淘宝618超级红包可以叠加使用吗?
- 帝国cms缩略图:网站不同地方生成不同的缩略图
- sulley测试环境搭建的相关总结
- 洛谷3165 CQOI2014 排序机械臂 splay
- 第一篇 树莓派刷机和系统基础配置