02 | 流量大、数据多的商品详情页系统该如何设计?
02 | 流量大、数据多的商品详情页系统该如何设计?
讲述:李玥
时长18:08大小14.53M
商品系统需要保存哪些数据?
商品基本信息该如何存储?
使用 MongoDB 保存商品参数
使用对象存储保存图片和视频
将商品介绍静态化
小结
思考题
赞 31
提建议
精选留言(90)
- 李玥置顶2020-02-26hi,我是李玥。跟上节课一样,我还是在留言板上同步一下上节课的思考题,大家一起来学习探讨。 上节课我们讲了两种实现幂等的方法,课后呢,我也让你思考了下,在你负责开发的业务系统中,能不能用这节课中讲到的方法来实现幂等?除了这两种方法以外,还有哪些实现服务幂等的方法? 关于这个问题,我是这么看的。 其实总结下来这些实现幂等的方法,无非是两大类,一类是通过一些精巧的设计让更新本身就是幂等的,这种需要点儿运气,不是所有业务都适用的。另外,就是利用外部的、具备一致性的存储(比如说MySQL)来做冲突检测,你在设计幂等方法的时候一般都可以顺着这两个思路来开展。展开共 2 条评论66
- 京京beaver2020-03-03一般价格系统是按照价格版本来配置价格的,比如1月1日-2月1日卖100元,有个版本id。价格的调整一般流程比较严格,因为涉及到扣点,供货价的调整,财务结算方式。一般前端用的比较多的是用促销活动,来调整用户的到手价。 如果确实有调价发生,会刷新商品信息服务,那里面冗余一份价格数据,这个延迟一般是秒级完成。如果用户商详页看到一个价格,下单时会重新检查当前价格,如果发生变更,一般会在购物车或者立即购买页面给出提醒,重新刷新当前页面来解决。展开共 4 条评论94
- 老姜2020-02-27mysql支持json数据类型了,是不是可以不用mongodb了,多一个数据库,系统就会更复杂
作者回复: 是的,如果能满足业务需求的话,尽量不要用太多的技术。
共 8 条评论59 - 漏脚脖2020-02-27老师你好,商品介绍静态化的地方不太懂想请教一下 我们公司现在的做饭是前端页面直接通过ajax请求数据,我理解的是静态化之后,商品介绍这部分就不用请求接口了,那这部分数据也需要初始化吧? 所以,我的第1个问题是,商品介绍这部分数据是怎么初始化的呢?难道是初始化到html文件里吗?我的第1个问题是,商品介绍这部分数据是怎么初始化的呢?难道是初始化到html文件里吗? 第2个问题,如果问题1成立,那是不是没个商品的介绍都要写到一个html文件里?那几亿个sku怎么做呢,要几亿个html?不太可能吧 这块老师能展开说一下吗,不太懂具体的实现展开
作者回复: 第一个问题,初始化的方式一般就是在商家后台修改了商详页中的商品介绍之后,重新生成一个该SKU的新的商详页HTML文件,这个HTML文件的内容直接就包含商品介绍等大段的文字。然后把这个HTML推送到CDN上,或者等CDN回源来拉取。 第二个问题,是的,每个SKU就会生成一个HTML。 对于像京东淘宝这样的超大规模电商,它们的做法又不一样了,它们的商详页会被划分得非常细,可能会被分为几十上甚至百部分内容,每一部分可能是静态化的HTML片段,也可能是走的缓存,或者是动态生成的,取决于后面支撑这一小块儿内容的系统了。
共 14 条评论39 - Din2020-02-26下单前先调用校验价格的接口,如果价格已经发生了变化,提示用户刷新页面。共 1 条评论31
- Ling2021-05-251. 作者讲了什么? 一个电商系统,流量集中的一个业务:商品详情系统的存储应该设计 2. 作者是怎么把事情说明白的? 通过将电商详情的数据需求出发,说明数据多样,无法一个系统解决,需要分而治之 - 从存储层面,数据区分为:固定结构数据、非固定结构数据、富媒体数据; - 从读取层面,将数据分为:经常变化数据、非经常变化数据 3. 为了讲明白,作者讲了哪些要点?哪些是亮点? **要点**: 1. 从数据存储到哪的角度: - 固定结构数据: 商品主标题、副标题、价格,等商品最基本、最主要的信息(任何商品都有的属性) 存储到:MySQL中 - 非固定结构数据: 商品参数,不同类型的商品,参数基本完全不一样。电脑的内存大小、手机的屏幕尺寸、酒的度数、口红的色号等等。 存储到不需要固定结构的存储:MongoDB或者MySQL的json字段中 - 富媒体数据: 商品的主图、详情介绍图片、视频等富媒体数据 存储到:对象存储。并且通过客户端直接调用对象存储的API,得到媒体资源在对象存储中的ID或者URL之后,将ID或者URL提交到MySQL中。 2. 从数据读取角度: - 存储到MySQL中的数据,需要设计一层缓存层,应对高并发读 - 对于不经常变动的数据: 静态化后,上CDN; 其实也可以不用生成html文件,直接把动态输出页面的接口作为CDN源站。 - 对于经常变动的数据:价格、促销信息 通过ajax接口动态获取 - 富媒体数据: 将对象存储设置为CDN源站,用户通过CDN访问富媒体资源 **亮点**: 通过一张图,非常清晰的总结了整体的设计思路,很赞!展开共 2 条评论19
- 何妨2020-02-28希望老师可以再展开讲讲商品介绍静态化这一块,有些意犹未尽,还是想详细了解一下,感觉看到了些门道但还是有些模糊
作者回复: 其实静态化都是“过时”的技术了。但是特定的场景还是非常有用。 现在的动态Web页面,都是用JS请求动态数据,在浏览器中填充内容。 早期的Web页都是Server端渲染,比如Java中的thymeleaf,FreeMarker 模板引擎,包括PHP本身就是个模板引擎,这些都是在服务端来填充好动态内容,再返回给浏览器的。 页面静态化就是利用这些模板引擎技术,事先就把页面中的动态内容填充好,生成一个一个静态的HTML。 这种静态化技术只适合页面内容很多,页面又不会经常变化的场景。比如我们电商的商详页,再比如很多新闻、咨询类的网站(一篇新闻发了之后很少会修改)。
共 8 条评论18 - 蹦~沙卡拉卡2020-03-24老师,我问下,商品每次变化都要保存一个快照。 假如商品表是table_a, 快照表是table_b, 那么订单关联的商品是关联 商品表 table_a 还是 快照表 table_b呢? 我的理解是关联快照表。
作者回复: 是的,关联快照。
17 - MadDog2020-02-27请问elasticSearch可以替换mongoDB嘛?elasticSearch也可以通过Dynamic field mappings做到类似功能
作者回复: 从动态字段这个功能上说,这俩数据库是可以互相替换的,哪个更好还是要看业务需求。 大多数场景下mongo写性能更好一些,ES更容易维护,功能也更丰富,但也有一些缺陷,比如深分页的问题,SQL支持还不是特别完善等等。 个人认为ES的前景更好一些,大家怎么看?
共 11 条评论17 - winzheng2020-03-16价格的变化:应该以用户体验为中心,商品加上版本号,根据用户提交时的版本号价格为准;如果用户是停留较长时间,需要给出超时商品变化的提示,起码用户可以理解这个问题,例如飞机票,停留时间长,价格变化,会給用户提示,当然,飞机票变更频率确实比商品高。共 2 条评论16
- 木木三2020-02-27谁用谁知道,真香共 1 条评论8
- 萨秋2020-03-17老师您好 想请问下静态化这块 如何做seo优化呢 类似于价格等信息都是爬虫主要抓取的 如果做成异步的话数据源就会有缺失 类似这样的问题
作者回复: 做SEO还是主要提供商品内容,很多电商都不希望价格被抓走,还要做各种措施来防止爬虫抓取价格。
5 - 大秦皇朝2020-03-04李玥老师您好: 上传了图片和视频后,但是又没有提交数据,那么服务器上是否会出现没有用的冗余/垃圾数据?那这块怎么判断和处理呢?
作者回复: 确实可能有这种情况。 没精力的话可以不管,反正垃圾数据也不太多,存储也便宜。 等积累到一定量了,再写个任务定期清理一下就可以。
共 3 条评论5 - 大土豆2022-02-07现在前后端分离之后,做法有变,页面静态化基本都是前端来做了。BFF全部是由前端负责,通常NodeJS来实现BFF,做请求合并,SSR,页面静态化,和后端没有半毛钱关系了,后端只返回数据,没有接触任何页面相关的东西,后端提供的全部都是动态的数据型接口。共 1 条评论4
- 子瞻2020-02-27下单的时候,生成商品价格,价格版本等的快照数据,结算时,和库里的价格版本信息对比,一致则进入支付,不一致则执行价格异常调整策略4
- 励研冰2020-04-09我做电商的时候在下单前会有一个Check的接口,客户端会上传预期的价格,后端检查发现价格发生了变化会返回提示让刷新页面,再重新Check3
- kamida2020-03-23老师 商品历史版本是在建一个单独的商品历史表 然后给它对于一个时间列吗
作者回复: 一般都是用版本号对应的。
3 - 大叶枫2020-03-12各种存储特性还是要依据业务特性去设计的,比如说订单表,单条查询走mysql去推进业务更高,毕竟主键查询性能锐减没有多少,批量有全文检索的可以有esdb。所以需要设计人员有时候在设计之初将字段分开设计,有普通检索字段,长文本可变打标字段,可变标记数值字段这类,后面变更存储的成本太大。3
- leslie2020-03-03最合适的解决方式应当是老师之前课程用的消息队列:在redis之上再去加一层消息队列去解决问题;课程跟完后这个就在用了,算是学有所用吧。共 4 条评论3
- hhhh2020-02-29老师想请教下,在存储商品参数的场景,用mysql的json类型存储与mongo, 如何做一下简单的权衡?不胜感激。
作者回复: 存储的选择没有谁好谁不好,还是看场景和需求。 如果只是单纯的存商品参数,MongoDB这种文档数据库更专业一些。 如果从统一技术栈来考虑,使用MySQL JSON能满足需求的话,也是可以的。
3