整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

解密电商平台-商品详情缓存!高可用架构设计必备

几节说了中小型电商公司,项目详情页的优化方案,一般是使用freemark模板生成了html静态页面,放到nginx或者tomcat中,但是肯定选择nginx的并发是tomcat的100倍,通过mq的方式刷新缓存生成新的html静态页面。一起看下大型互联网关于商品详情的架构。



(一)讲解上图的的详细信息

这些架构是根据业务多年演变而来的,可不是最终就是这样的。机器的内存有上限的话,并发量也是有上限的,一台redis可以存储100g,你水平扩展100台其实还是100g,必须 通过分片的方式这样就是10t的数据存储空间。

  1. 通过LVS负载后,转发到下面nginx(分发器),这里的nginx(分发器)只有2个,但是实际的环境下可能有多个水平的。
  2. nginx(分发器)下面是通过hash转发到nginx(应用层),之前的nginx只有一层,现在的nginx搞了2层,为了是分片存储,大大提高本地缓存的利用率。
  3. 3.nginx(应用层)转发到缓存服务,类似tomcat的一个应用,缓存服务在实际的大型互联网公司肯定有很多台,都是水平扩展的。缓存服务里面实际是就是一个web应用,这里画了2个一个redis集群和ehcache。
  4. 这里就是转发过来的http请求,然后redis集群拿数据,如果有马上返回给前端,如果没有通过内存中取。ehcache(JVM缓存)和redis这2个顺序不一定,根据场景来的。
  5. 商品服务,库存服务,会员服务,交易服务有变动的话异步的调用MQ更新缓存,一般正常的情况都是异步来请求的。更新缓存有很多的并发问题。
  6. 之前说过如果处理并发问题最好的方案,就是线性处理,让并发的变成串行。用上MQ一定能保证变成串行。
  7. 一个lua脚本下面加了nginx的本地缓存去渲染这个html模板,nginx本地。lua脚本相对来说比freemark这种快太多了。
  8. 缓存内放入的都是不经常变化的。如果经常变化的都是ajax异步请求的方式来完成的,或者通过其他的系统来负责关联静态的html。

(二)介绍本书

其实之前的几次关于互联网的技术方案,都是通过这个书【亿级流量网站架构核心技术】里面的内容分享出来的,我加入了自己的思路。通过我的思路引导更容易的理解,如果没做过互联网的老铁,直接看这本书不一定看的懂,很多方面他都是一句话就过了。没有详细的解释里面的业务场景。

PS:通过看的技术文章,在详细的看看这本书,其实互联网技术不过如此,自古真情留不住,唯有套路的人心,都是前人总结的解决问题的方案和套路,对于有互联网经验这本书还是很不错的,大大的拓宽技术经验,光看这本书的目录估计都被虎的一愣一愣的,其实都不复杂,都是一些经验,其实在互联网公司呆过这些都是常用的技术。还是那句话,没搞过想破脑子就是不会,需要的还是场景。

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

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

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

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

主要面临的挑战有:

  • 高性能,商详页聚合服务比较多,要保证商详页在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;那么我们可以这样子来获取数据:

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

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

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

本文由 @Nicole 原创发布于人人都是产品经理。未经许可,禁止转载。

么是详情页?简单来说,它是商品图片和商品文案按照一定规律进行排版后可以展示给目标用户的视觉“产品”。

在服饰详情页中,图片和文字是基础,前者大多在商品属性、尺码信息、设计理念模块发挥必要的介绍作用,同时也作为模块分割、图片强调的元素出现。同时,好的排版能起到画龙点睛的作用。


那么,一款高转化服装详情页究竟该如何设计呢?一般来说,需要设计以下7大模块


优化区域:包含亮点展示、版型特点、面料工艺和潮流趋势等;商品信息:包含基本信息、指数信息、尺码表、尺码推荐表和试穿报告等;搭销模块:酌情使用场景化搭销、关联搭销和同类款推荐销售可提升连单率及流量利用效率。 此外,还有海报区域、模特展示、平铺展示、细节展示。

以上模块排布顺序需要根据目标客户、商品风格和店铺定位综合确定,这里不再赘述。需要注意的是,单一模块的设计排版也有很多学问,下面展示一组模块优化前后的视觉对比分析:


优化点:

1、色调选用符合店铺风格;

2、字体及用色使海报更为亮眼 ;

3、整合精简海报文案及修饰布局 。


优化点:

1、整体用色更加大胆,风格鲜明,修饰素材更丰富;

2、版面排布样式合理,贴合PC端及手机端共用版面设计排布(模特信息可1-2个灵活展示)。


优化点:

1、模特图背景 需右侧扩边才可满足展示样式,制版时有扩边功能,但只可四周同时扩边(纯色与复杂背景扩边也不同);

2、调整后左侧模特图可展示正常比例,无需扩边。


优化点:

1、整体视觉排布更直观;

2、素材图选取更加精美;

3、文案关键字排布合理,突出面料特性 。


优化点:模特位置需靠左侧些,预留出搭配图展示的空间。 搭配图框用竖构图更为合适。(平铺图与画框之间上下空间比较狭窄,故画框适合用竖构图) 两款搭配图位置需放置在右下角,右下角空间比较空余,不易遮挡模特身体。深绘美工机器人如何保证详情页的高转化率?

模板逻辑:图文架构、模块逻辑清晰有序;

模板尺寸:确保页面宽度和详情切片高度达到最佳使用尺寸;

图片选用:对素材图类型做了规范,契合模板套用;

字体选择:选用的字体贴合品牌风格,同时规范了字体的大小、间距、行距及HTML区的使用;

色彩搭配:各元素用色贴合季节、类目属性及品牌风格;

内容排版:把握各元素的对齐及区块之间的节奏感,规范图文排版的组合、重复与循环;

终端兼容:保证PC端、无线端等多终端共用的良好体验;

搭配销售:根据用户的素材条件,酌情使用场景化搭销、关联搭销和同类款推荐销售区域。

以上规范和属性均在高转化模板中体现:

如何用美工机器人中小商家版做一款高转化服装详情页(支持免费试用)?核心流程有四步:

1、免费领取适合自己店铺和商品定位的高转化模板(1100多款模板可选);

2、填写详情页和上货必需的字段,并上传商品图片包;

3、系统自动分析裁剪归类图片并排版详情页(电脑端和手机端同步);

4、系统自动上货(支持三种上货状态的选择)或者导出详情页切片。

整个过程仅需要10分钟左右,如果批量制作详情页并自动上货,平均用时仅需3-5分钟。