基础设施层介绍
2023-09-28 20:58:17 0 举报
AI智能生成
基础设施层介绍
作者其他创作
大纲/内容
右侧数字点击展开
redis
如何解决缓存穿透问题?
对于商品微服务增加布隆过滤器在web拦截器中,所有需要查看商品详情的请求必须先过布隆过滤器,利用spring扩展点InitializingBean提前将生成的bloomFilter数据存入redis中
如何设计多级缓存?
除了nginx和redis可以做缓存外,微服务本身也可以做缓存。针对前台的门户服务中,结合CaffeineCache做秒杀和促销数据的双Buffer本地缓存,前端发起对首页数据的请求时,只有当本地两个缓存都失效时才从远端获取(redis和促销微服务),为了提高缓存的命中率则利用spring定时任务,异步刷新本地缓存
本地双缓存配置
获取首页内容的实现方法
异步RefreshCache
如何实现缓存预热?
实现springboot提供的接口CommandLineRunner,可在门户服务启动时提前从redis或数据库中(feign调用促销微服务)获取数据到本地双缓存
如何利用redis实现分布式锁?
在促销微服务获取首页推荐品牌和产品时,避免过多流量直接请求和重复访问数据库,利用redis分布式锁进行并发控制
如何保证缓存与数据库的一致性?
通过mall-canal微服务的异步定时任务监听canal服务中数据变更消息,根据消息类型进行对应处理,将数据同步到redis集群上
异步定时任务拉取未ack即数据变更消息
消息分类处理
redis缓存同步处理
canal
阿里的开源中间件,canal将自己伪装mysql的从服务器(slave),从而监听到数据变更的binlog日志,canal客户端可以订阅和消费数据库表变更消息,除了同步数据到redis中,还可以将商品数据变更同步到elasticsearch中,来保证elasticsearch的数据一致性
canal客户端配置
rocketmq
如何完成异步下单?
基本原理:RocketMQ的设计中broker与producer端的双向通信能力,使得broker天生可以作为一个事务协调者存在;而RocketMQ本身提供的存储机制
为事务消息提供了持久化能力;RocketMQ的高可用机制以及可靠消息设计则为事务消息在系统发生异常时依然能够保证达成事务的最终一致性。
为事务消息提供了持久化能力;RocketMQ的高可用机制以及可靠消息设计则为事务消息在系统发生异常时依然能够保证达成事务的最终一致性。
- 普通商品下单链路分析
- 根据购物车信息生成订单后直接插入数据库中,同时锁定库存(ProductFeignApi)、删除购物车商品(CartFeignApi)、获取订单详情item的全局Id(unqidFeignApi)、设置收货地址和相关积分(UmsMemberFeignApi),这些需要分布式事务来保证(采取Seata的AT模式实现GlobalTransaction)
seata客户端配置
2.1前端请求支付二维码的同时,向rocketmq发送事务消息,该消息反向通知是否取消订单。rocketmq事务监听者在本地事务中只向Redis中记录回查次数 并返回UNKNOWN状态。 2.2事务回查时向支付宝请求订单支付状态,如果支付成功则删除redis记录、更新订单支付状态、扣减锁定库存并返回ROLLBACK状态,否则 回查次数+1返 回UNKNOWN状态。 2.3超过最大回查次数则更改订单状态为无效(即订单超时),返回COMMIT状态。
2.1
2.2
3.订单消息消费者收到取消订单的消息后,调用ProductFeignApi恢复真实库存、扣减锁定库存。
- 秒杀商品下单链路分析
- 返回秒杀订单确认信息前,需要提前从分布式唯一Id微服务(unqidFeignApi)获取order_id和order_Item_Id并存入本地缓存,如果获取不到足够的Id则不允许用户下单。
2.校验是否有权限购买商品,从redis取出当前要购买的商品库存和下单排队状态,如果售罄了在本地cache中标记状态,否则,继续检查是否用户在上个商品 还未下单完成又重复购买,这些情况则返回失败信息,禁止用户购买。
3.验证秒杀时间是否超时、获取用户收货地址、计算订单总金额,完成秒杀信息确认单
4.秒杀商品下单,采用redis缓存中直接扣减库存,结合RocksDB本地数据库快速持久化扣减记录来应对redis宕机的情况
5.向Rocketmq发送异步下单消息,如果发送失败需要还原预减库存、清除本地售罄标记缓存、向redis发布相关channel信息
6.创建秒杀订单Topic下的消费者收到消息后,开始扣减库存(promotionFeignApi),向订单表中插入订单记录和关联信息,继续向mq发送订单超时取消的消 息(延迟消息),根据是否发送成功更改redis中订单排队标记。
7.前端开始轮询订单状态,如果订单排队标记>1则代表下单成功跳转到支付页面,否则秒杀失败返回重试。
8.用户进入支付页面,准备扫描支付宝二维码支付订单。
9.延迟时间结束,取消订单消息的订阅者收到消息则开始检查订单支付状态,如果为未付款status则恢复促销商品数量(PromotionFeignApi)和redis库存
订单相关Topic
elasticsearch
作为搜素引擎,es可以存储和检索商品信息的文档,结合mall-search微服务作为其客户端,实现对es文档数据格式到java类的转换,完成前端关键字搜索商品的功能。
利用es可视化平台kibana创建索引库、模拟添加和检索商品文档,从而分析相关语法结构实现java客户端构建es请求和响应的数据格式的映射关系
es检索文档语法
es创建商品索引库语法
es添加文档语法
如何通过RestHighLevelClient构建关键字检索商品的请求和响应?
封装请求参数信息:关键字查询、根据属性、分类、品牌、价格区间、是否有库存等进行过滤、分页、高亮、以及聚合统计品牌分类属性
构建查询条件
实现排序、高亮、分页操作,对品牌、分类信息、属性信息进行聚合分析
封装查询到的结果信息
在Elastic Stack生态圈中Elasticsearch作为数据存储和搜索,是生态圈的基石,Kibana在上层提供用户一个可视化及操作的界面,Logstash和Beat可以对数据进行收集。采用elk作为日志收集和管理功能的实现。
logstash监听filebeat推送信息,进行过滤和响应处理后发往es进行存储
利用logback将微服务日志信息持久化到本地文件,同时filebeat监听文件变化,向logstash推送信息
es还可用来存储skywalking链路追踪的相关数据,避免没有请求时无法看到微服务调用链路的情况。当服务出现出现错误时,可通过es中错误日志的信息定位到traceId后直接在skywalking中追踪链路情况。
0 条评论
下一页