一、概述
商品详情页的相关数据来源于多个不同的地方,比如订单微服务中的评价数据、库存微服务中的库存数据、活动微服务的活动数据、推荐微服务中的推荐数据、商品微服务自己的相关数据。
如果正常来做,我们需要同时请求多个微服务获取相关数据,再将数据进行整合,然后返回给前端。
但这样做存在一些问题,其一是响应速度慢,即使我们并行请求多个微服务,也不会太快,而且还要进行数据整合。其二是一旦其中一个微服务挂掉,就会影响到商品微服务的正常运行。
基于此,我们通过MongoDB+RabbitMQ实现数据异构聚合,加速商品详情页访问,实现数据闭环。
二、数据异构
数据异构在应用中,一般体现为两方面。
1、将其他微服务的相关数据另外保存一份到本微服务
举例:商品详情需要用到订单评价、商品活动信息、库存信息,为了加速访问,实现数据闭环,不至于因为其他微服务挂了,商品微服务也跟着不能提供服务,因此在商品微服务的数据库中(MySQL、Redis、MongoDB)同样保存一份相关数据。
在用户请求商品详情时,商品微服务根本不需要再去请求其它微服务获取数据,只需要读取本地相关的数据即可。
注:其它微服务数据发生变化时,需要通过RabbitMQ方式推送更新到商品微服务,商品微服务相关数据读取MQ并更新。
2、本微服务中,针对同一张表进行数据异构。
举例:订单信息在商城系统中一般都可以达到上亿级别,这时如果一个用户查询其历史订单,或者一个商户查询其历史售卖订单,响应将会很慢。
这时,我们可以根据原来的订单表,再创建一张用于用户历史订单查询的数据表,和一张用于商户查询其历史售卖订单的数据表。甚至可以通过分表,把一个用户的所有订单存在同一张表上,把同一商户的所有订单也存在同一张表上,这样用户或商户查询时,将不会在请求原订单表,而是分别请求我们新异构出来的两张表。
三、数据聚合
数据聚合,就是把多个微服务中的相关数据聚合为一条数据。
举例:商品详情页中,需要用到商品数据、订单数据、库存数据、活动数据、推荐数据。
之前通过数据异构,将这些用到的数据都异构到了商品微服务的MySQL中,所谓数据聚合就是将这些数据再整合在一起,存储到MongoDB中(MongoDB相对于Redis,虽然同样是内存存储,但是优点在于支持字段索引、where条件查询,擅长查询 JSON 数据)。
之后用户请求商品详情时,只需要从MongoDB中取出这条数据,直接返回即可。不用再请求其它微服务获取数据,然后再进行数据整合了。
这样做的好处显而易见,有两点:
(1)其它服务挂掉,不影响商品微服务提供服务,实现了服务闭环
(2)提升响应速度,不需要再请求多个微服务然后进行数据整合了