电商系列之商详

   > 插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

坚持不懈,越努力越幸运,大家一起学习鸭~~~

如何尽量减少用户的流量,减少客户端与后台的交互,让用户在APP上有比较好的体验,这些都是在设计商详系统时候需要面临的挑战。

今天来跟大家聊聊商详,商详是展示商品详情信息的一个页面,整个购物流程比较重要的一个部分,承载着网站的绝大部分流量。为了提高转化率构成商详的元素非常丰富,有大量的图片、部分商品还有视频介绍、有相对静态的商详模板,有实时变化的价格、促销、库存。

下面我们先来看下商详上一共有哪些元素组成?

1

可以看到商详上的元素非常多,总结下来分为这么几个维度:商品维度(标题、主图、规格参数、商品文描)、分类维度、商家维度、店铺维度。另外还有一些实时性比较高的:价格、实时促销、配送地址、库存、广告等。

主要面临的挑战有:

  • 高性能,商详页聚合服务比较多,要保证商详页在1-2秒内可以打开。
  • 灵活性较好,可以快速响应页面变更需求。
  • 具有较好的扩展性,当访问量增加的时候可以随时进行水平扩展。
  • 要能够做到柔性降级,自带开关。某些底层服务出问题时可以通过开关进行相应降级处理。

针对商详可以有几种不同的实现方式,用户看到的是同一个商详页,但背后实现的方式却多种多样,下面给大家介绍几种常见的实现。

第一种实现方式:单机版

整个网站放在一台机器上,通过几条SQL分别拿到商详需要展示的各种信息,聚合成一个大的接口吐出给前端展示。

优点:逻辑简单。灵活性较好,可以快速响应页面变更需求。

缺点:性能比较差,没有扩展性。

第二种实现方式:缓存银弹

在第一版的基础上增加各种维度的缓存。可以将主图、商详的HTML模板放到CDN上,每个商品的聚合信息可以放到cache中,不需要每次请求都通过DB获取商品数据。

优点:可以一定程度上提高性能。

缺点:需要解决缓存与DB的数据一致性问题,单纯增加缓存面临数据实时性不高,底层数据已经修改,缓存中还不是最新数据。若任何底层数据变更实时更新缓存则修改工作量较大。另外仍然没有解决扩展性问题。当请求量过大,或者商品数据过多将导致性能变差。

第三种实现方式:分布式服务化

按照领域进行切分,不同业务领域独立实现分别部署,将商详依赖的底层业务领域分别拆分出来。例如,商品、库存、促销、地址等分别进行服务化。每个子领域的服务自己保证各自的性能。

优点:具有很好的灵活性。当有业务需求变化的时候,每个子领域内部自行修改,对外部提供的接口协议不变,对外部无感知。并且具有良好的扩展性,当请求量或者数据量比较大的时候,每个子领域都可以分别进行横向扩展。

缺点:开发难度变大,由于按照领域进行服务划分,往往原来一行SQL可以搞定的事情。现在要涉及到多个领域一起配合来修改,需要协商接口协议,各个领域内部仍有不少开发量。

下面我们来说几个基本的概念,上面提到的服务到底是什么?

服务:自己自足的、无状态的业务功能,通过定义良好的标准接口,它接受一个或多个请求,返回一个或多个应答。

  • 服务不应依赖于其他功能或过程;
  • 用于提供服务的技术,编程语言,不构成定义的一部分;
  • 服务体现了业务功能,聚焦于流程,服务的主要目标是体现业务功能的“自然”步骤。就服务起作用的业务而言,服务应该代表了一项自足的功能,对应着一项真实世界的业务活动,业务人员应该理解服务干了什么。

接口和契约(技术层面)

  • 一项服务是一个处理(多个)消息的接口,返回信息,以及/或者改变实体(后端系统)的状态
  • 前置条件、后置条件(安全意识,不信任原则)
  • 粗粒度:有助于分离服务提供者的内部数据结构和外部接口
  • 接口的版本、向后兼容

上面介绍了分布式服务化的方式来实现商详的技术架构,那么这样是不是就完美了?在实际情况下即使这种架构还是有很多不可控的因素会影响整个商详的性能。最重要的一个就是对外部服务的依赖。如果外部服务出现抖动那么整个商详页也会随之出现不稳定。尤其商详是个比较大的聚合服务,底层依赖的服务比较多,任何一个出问题都会受到影响,那么商详出错的概率就会比较大。如何解决这个问题呢?

一种方案是要求所有底层服务各自保证自己的稳定性,这需要有比较完善的监控体系,能够快速找到出问题的点,然后进行修正。这种方案属于比较理想状态,对外部有强依赖。这需要有一个比较靠谱的团队,团队中每个人负责的领域稳定性、健壮性都比较高,那么这种方式是比较好的,领域的划分比较清晰,各自的职责也比较清晰。大家各自把自己的领域做好,那么整个网站的效率都比较高。

这对整个团队要求比较高,这种团队是存在的,但是当公司业务发展比较快,团队人数增长也比较快的时候,这时候团队的质量就比较难保证了,就会出现某一个领域或者某几个领域质量不是很高,就会导致整个服务调用链都不稳定,对整体网站影响较大。那么出现这种问题时如何解决呢?

互不信任原则

对外部不信任的原则是服务自我保护最重要的方式,尽量降低外部服务出问题时对本服务的影响。对于一个写服务来说,一定要校验外部服务调用的所有参数是否合法,对每一个调用方分配场景ID记录调用来源,并且自己要做幂等去重处理。设计系统时首先想到对于这个外部调用一旦失败该如何处理?是否有相应的降级策略?对于不同调用失败的场景一定要清晰记录错误信息方便后面调试跟踪解决问题。

数据闭环

数据闭环即数据的自我管理,或者说是数据都在自己系统里维护,不依赖于任何其他系统,去依赖化;这样得到的好处就是别人抖动跟我没关系。

  • 数据异构:是数据闭环的第一步,将各个依赖系统的数据拿过来,按照自己的要求存储起来;
  • 数据原子化:数据异构的数据是原子化数据,这样未来我们可以对这些数据再加工再处理而响应变化的需求;
  • 数据聚合:将多个原子数据聚合为一个大JSON数据,这样前端展示只需要一次get,当然要考虑系统架构,比如使用Redis,Redis又是单线程系统,我们需要部署更多的Redis来支持更高的并发,另外存储的值要尽可能的小;
  • 数据维度化:对于数据应该按照维度和作用进行维度化,这样可以分离存储,进行更有效的存储和使用。

下面是一种相对比较简单的维度的划分:

  1. 商品基本信息,标题、扩展属性、特殊属性、图片、颜色尺码、规格参数等;
  2. 商品介绍信息,商品维度商家模板、商品介绍等;
  3. 非商品维度其他信息,分类信息、商家信息、店铺信息、店铺头、品牌信息等;
  4. 商品维度其他信息(异步加载),价格、促销、配送至、广告词、推荐配件、最佳组合等。

降级开关

当底层系统出现问题时候要能够做到通过开关的配置屏蔽底层系统的波动对商详的影响,例如当底层的库存系统出现问题时可以通过开关进行配置商详屏蔽调用库存接口,默认所有商品有库存,这样库存数量可能不是最准确的,但至少可以保证用户正常浏览商详页不至于由于底层系统的波动导致整个商详页面打不开。在系统设计时候要尽可能的多预留降级开关,能降级的地方都要做好降级的准备,只有这样才能保证商详的高可用。

异步并发

假设一个读服务是需要如下数据:

  1. 数据A  10ms
  2. 数据B  15ms
  3. 数据C   20ms
  4. 数据D   5ms
  5. 数据E   10ms

那么如果串行获取那么需要:60ms;

而如果数据C依赖数据A和数据B、数据D谁也不依赖、数据E依赖数据C;那么我们可以这样子来获取数据:

2

那么如果并发化获取那么需要:30ms;能提升一倍的性能。

假设数据E还依赖数据F(5ms),而数据F是在数据E服务中获取的,此时就可以考虑在此服务中在取数据A/B/D时预取数据F,那么整体性能就变为了:25ms。

上面我们聊了聊关于商详的部分技术实现方案,下期将跟大家聊聊电商的抢购系统的哪些事儿,敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java解数独(力扣Leetcode37)

数独问题 力扣原题链接 问题描述 数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 数独部分空格内已填入了数字,空白格用.表示。 示例 示例&…

微服务监控:确保分布式系统的可观察性与稳定性

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 一、前言二、微服务监控的重要性三、关键监控指标四、常用监控工具五、最佳实践六、结论 一、前言 在当前的软件开发领域&a…

const在指针中的作用以及*p在各种写法中分别代表什么含义

const在指针中起固定的作用,在不同的写法中其效果也有所区别,具体如下: 1、int* const p固定的是指针p指向的地址。 2、int const *p固定的是指针p指向地址中储存的内容。 例: 以上操作在编译器中执行不了,会报错。…

项目中预览图片时,添加水印,浏览器禁止右键功能、前端禁止直接获取图片地址。(Vue3、TS、canvas)

在src/utils文件夹下新建watermark.ts,写入以下代码块,生成水印文件 // 导出函数 getWatermark,它返回一个对象,其中包含一个名为 watermark 的方法。 export const getWatermark () > {const setWatermark (str: any) >…

Java基础知识总结(29)

Java虚拟机 运行时数据区 程序计数器 方法区:Java 8以后没有方法区,改为了元空间(MetaSpace) 虚拟机栈 堆 本地方法栈 程序计数器 它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里&#xff0c…

flutter生成二维码并截图保存到图库

引入库:flutter_screenutil、image_gallery_saver、qr_flutter弹窗布局 import dart:async; import dart:typed_data; import package/generated/l10n.dart; import package:jade/configs/PathConfig.dart; import package:jade/utils/ImageWaterMarkUtil.dart; im…

瑞吉外卖实战学习--8、人员禁用和启用

前言 1、通过前端页面查看接口 会发现请求方式是put 请求接口是employee 2、检查页面传值 根据浏览器的请求可以看到传值为id和status 2、写put请求,添加修改时间和修改人的id然后传回给后台 /*** 启用和禁用员工账号* param request* param employee* return…

【Consul】Linux安装Consul保姆级教程

【Consul】Linux安装Consul保姆级教程 大家好 我是寸铁👊 总结了一篇【Consul】Linux安装Consul保姆级教程✨ 喜欢的小伙伴可以点点关注 💝 前言 今天要把编写的go程序放到linux上进行测试Consul服务注册与发现,那怎么样才能实现这一过程&am…

25Ramdisk 启动模式简介

Ramdisk 启动模式简介 ramdisk是一种虚拟磁盘技术,我们的PE系统几乎都是使用ramdisk方式从计算机启动的.那么,ramdisk有哪些特点呢? Ramdisk 将内存虚拟为一个磁盘 Ramdisk技术会将你的一部分内存虚拟成一块磁盘分区.使用U盘启动pe系统时,打开pe系统里的文件资源管理器,你会看…

CKS之安全沙箱运行容器:gVisor

目录 一、gVisor介绍 二、gVisor架构 三、gVisor使用前置条件 四、Docker中使用gVisor 五、containerd中使用gVisor 六、Kubernetes结合gVisor使用 一、gVisor介绍 gVisor是Google开源的一种容器沙箱技术,其设计初衷是在提供较高安全性的同时,尽量…

Stable Diffusion 推荐硬件配置和本地化布署

Stable Diffusion简介 Stable Diffusion是由Stability AI开发的一种强大的文本到图像(Text-to-Image)生成模型,它能够根据用户提供的文本描述,生成与之相关的高质量、高分辨率图像。下面我从原理、特点、应用三个方面对Stable Diffusion作简要介绍: 1、原理:Stable Diffusion…

从输入url到页面展示的过程

唠唠叨:我不想误人子弟,我这篇算是搬运工,加上自己的理解做点总结,所以还请大家科学上网去看这篇:https://aws.amazon.com/cn/blogs/mobile/what-happens-when-you-type-a-url-into-your-browser/ 是这六个步骤&#…

杰发科技——Jlink插件使用

0. 简介 杰发自带的烧录工具是ATCLink,基于DapLink适配。个人不太喜欢ATCLink,推荐使用Jlink,毕竟自己买,不用问原厂要,而且带Jlink,至少5Mhz以上。 V9烧录器使用7.50以下版本驱动。 V11烧录器可以使用7…

热烈祝贺阿里云PolarDB登顶2024最新一期中国数据库流行榜

热烈祝贺阿里云PolarDB登顶2024最新一期中国数据库流行榜 墨天轮墨天轮国产数据库流行度排行PolarDB首度夺魁关于话题的讨论数据库流行度排行榜会影响你的数据库选型吗?对于 PolarDB 的本次登顶,你认为关键因素是什么?PolarDB“三层分离”新版…

【Review】小米汽车发布会

动力方面 顶配双电机四驱,小米超级电机21000转,最大马力673ps,峰值功率495kW,峰值扭矩838N.m。风阻系数最低0.195,零百加速最快2.78秒,时速最高265km/h。 底盘方面 前双叉臂,后无五连杆&#xf…

springcloud第4季 远程调用openfegin的介绍4

一 openfegin的介绍 1.1 openfegin的介绍 openfegin是一个声明式的web客户端;只需要创建一个rest接口并在该接口上添加注解FeginClient即可。openfeign基本上就是当前微服务之间调用的事实标准。 openfeign同时还集成了sprigcloud loadbalance。

01-XML-01认识XML

XML 被设计出来用于数据的记录和传递,经常被作用为配置文件 什么是XML 可扩展标记语言(Extensible Markup Language),没有固定的标签,所有的标签都可以自定义。使用简单的标记来描述数据通常,xml被用于信息的记录和传…

An Interview

What is your experience with Python and MySQL? Can you provide examples of projects you have worked on using these technologies? How would you handle customer requirements gathering and analysis? Can you provide an example of how you have translated cu…

C++—vector的介绍及使用 vector的模拟实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

20240323-1-条件随机场面试题CRF

条件随机场面试题 1. 简单介绍条件随机场 条件随机场(conditional random field,简称 CRF)是给定一组输入随机变量条 件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫随机场,是一种鉴…