简单的订单业务的基本模型设计用户、商品(库存)、订单、付款,这里只考虑商品和订单,流程是下订单 -> 减库存,这两步必须同时完成,不能下了订单不减库存(超卖),或者减了库存没有生成订单(少卖)。超卖商家库存不足,消费者下了单买不到东西,体验不好;少卖商家库存积压或者需要反复修改商品信息,反复麻烦,体验也不好。

在系统初期,承接流量小,很多创业团队都是单库的模型(是的,大家都在一起。。。)。这种模型带来了极大的方便,不用跨库,更没有跨节点,能够方便的利用数据库提供的事务来实现下单和减库存的原子操作,还能进行各种联表和子查询(运营MM需求再变态,我会SQL能奈我何)。但也正是这些优点,会成为流量上来后对系统进行扩展的绊脚石。联表、子查询、事务都是将多张表绑定在了一起,拆库、拆表就麻烦了。

后期系统流量逐渐升高,单库的读写性能不够,这时候会考虑将数据库进行拆库、分表。比如商品和订单分为两个集群,集群内又根据各自业务维度进行分库和分表,商品可以根据卖家维度来切分,订单一般根据买家维度切分,并且根据卖家维度做冗余。这个时候出现的问题,还是经典问题——数据一致性,数据拆分后商品和订单不在一个库里,怎么保证一致性;买家维度的订单数据怎么和卖家维度的订单数据保证一致性。有两个解决思路:

(1)分布式事务,经典的有基于2PC的实现。优点是封装得足够好后使用起来和单库虽然有区别(主要是复杂查询语句),但总体来说对业务的改动不会很大。缺点是性能太差,本来引入分布式数据库主要是为了成倍的提高性能,但因为分布式事务的引入将这个性能的提升大打折扣,很多时候这个性能是难以接受的。

(2)消息中间件,本文主角,消息中间件的一大职能就是负责各个系统间的交流,非常适合这里的商品和订单系统的同步问题。引入消息中间件后的下单流程是:用户A下订单后给消息中间件发送消息,商品系统订阅订单消息,并扣除相应的库存。

这里有几个注意点:

a、消息的传递是需要时间的,下单前查看有库存,但在并发条件下,实际减库存时可能库存不够,所以必须在库存扣减成功后才能显示订单成功,即下单后标记已下单,但用户对该状态不可见,等待商品系统减库存成功后,再通知订单系统更新状态(仍然是消息中间件的运用哦);

b、对消息的可靠性要求很高,发送消息时返回成功就要保证该消息会被投递,发送失败需要下单业务自己做回滚;

c、消息的可靠性高表示一定会有消息重复,这里需要商品系统自己做幂等,可以通过消息id来做去重,否则会少卖;

d、下单成功失败前端用户都希望尽早得到通知,所以在下单成功后需要设定一个定时消息,在一段时间后如果订单库存还没有扣除成功,这个时候应该通知用户下单失败,并且定期回补这部分多扣的库存。

引入消息中间件,可以很好的解决了分布式数据库数据同步的问题,避免了分布式事务。并且额外的好处是减少了减库存时候的并发锁争抢,性能杠杠的。

相关标签:mysql

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

电商系统设计MySQL_电商系统中的下单功能的mysql架构设计相关推荐

  1. 电商系统中的商品模型的分析与设计—续

    在<电商系统中的商品模型的分析与设计>中,对电商系统商品模型有一个粗浅的描述,后来有博友对货品和商品的区别以及属性有一些疑问.我也对此做一些研究,再次简单的对商品模型做一个介绍. 从SPU ...

  2. linux中bash的功能主要有,Linux系统中的Bash功能的介绍

    今天小编要跟大家分享的文章是关于Linux系统中的Bash功能的介绍.一个完整计算机的体系结构包括:硬件与软件,而软件又分为系统软件与应用软件,负责对硬件仅需管理与操作的是系统软件的内核部分,用户是无 ...

  3. 现代IM系统中消息推送和存储架构的实现

    摘要: 前言 IM全称是『Instant Messaging』,中文名是即时通讯.在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉.微信.QQ等以IM为核心功能的产品 ...

  4. 消息已读未读的模型设计_阿里云技术专家分享:现代 IM 系统中消息推送和存储架构的实现...

    前言 IM 全称是"Instant Messaging",中文名是即时通讯.在这个高度信息化的移动互联网时代,生活中 IM 类产品已经成为必备品,比较有名的如钉钉.微信.QQ 等以 ...

  5. command在计算机中的意义,MAC系统中Command键功能有哪些

    这篇文章主要介绍了MAC系统中Command键功能有哪些,,需要的朋友可以参考下 Mac苹果电脑的Command键位于空格边上,相信大家都会很经常用到的,不过,你知道Command键有哪些其他功能吗? ...

  6. win7关闭系统索引服务器,如何关闭Windows7系统中的索引功能

    Windows7系统中的索引功能有什么作用?简单的说就是为系统的文件等内容提供索引和搜索结果,一般很少用到,而且还占用一定的系统资源,如果你发觉你的系统越来越慢,可通过关闭索引功能. 如何关闭Wind ...

  7. 【Android笔记67】Android之使用系统中的相机功能(拍照、保存照片、显示拍摄的照片、照片保存到图库等操作)

    这篇文章,主要介绍Android如何使用系统中的相机功能(拍照.保存照片.显示拍摄的照片.照片保存到图库等操作). 目录 一.使用Android相机功能 1.1.如何调用相机功能 1.2.调用相机功能

  8. 阳光旅行网app中用户下单功能,《使用Java实现面向对象编程》内部测试机试题

    一.语言和环境 A.实现语言 Java B.环境要求 MyEclipse 10 二.功能要求 开发阳光旅行网app中用户下单功能,可实现用户添加订单并完善出行人信息.修改订单,删除订单以及打印行程信息 ...

  9. 高并发、高性能下的 会员系统[同程艺龙] — 高可用架构设计实践

    目录 会员系统[同程艺龙] - 高可用架构设计实践 ES高可用方案 ES双中心主备集群架构 ES流量隔离三集群架构 ES集群深度优化提升 会员Redis缓存方案 Redis双中心多集群架构 高可用会员 ...

最新文章

  1. 快速启动神器 Wox
  2. 【Codevs1322】单词矩阵
  3. php nodejs 前台,NodeJS之前端注册页面
  4. 【Python教程】读写ini配置文件的详细操作
  5. 如何在单个测试中同时执行多个断言
  6. 学习程序开发的方法,仅供参考吧
  7. Redis事务深入解析和使用
  8. OpenERP 中的on_change方法总结
  9. 微信小程序 data中数据值的更改与储存
  10. 20190905每日一句
  11. cacti不能实时刷新流量图_解决Cacti无法正常监视超过100M以上流量的问题
  12. app移动接口开发需要注意什么
  13. OpenV2X开源社区亮相全球边缘计算大会
  14. 在线matlab,亲测好用
  15. MP4-M3U8在线P2P加速视频播放器PHP源码
  16. 淘宝618超级红包可以叠加使用吗?
  17. 帝国cms缩略图:网站不同地方生成不同的缩略图
  18. sulley测试环境搭建的相关总结
  19. 洛谷3165 CQOI2014 排序机械臂 splay
  20. 第一篇 树莓派刷机和系统基础配置

热门文章

  1. JS获取本周、本月的开始日期和结束日期
  2. 【调剂】沈阳理工大学关于2023年硕士研究生招生部分专业拟接收调剂的说明
  3. 25.【终极】实战研究二:IMDB影评得分估计
  4. 对12306.cn的建议!!!!!
  5. 关于对《弹道导弹攻防对抗的建模与仿真》一书中部分章节模型的Python复现
  6. Read the Docs 从懵逼到入门
  7. 【使用D3D11直接渲染YUV数据】
  8. 苹果是如何成就帝国的?
  9. 日语助词小结,日语助词特殊用法总结
  10. 三星新机今日发售,或意在抢滩区块链手机蓝海