最近电商挺火,面试如果能聊一聊电商,基本能够拿下初试,在作者复习的同时,留下足迹,供后者参考。。。
1.购物车模块
1.为什么要购物车存在??体验性
购物车模块要能过存储顾客所选的的商品,记录下所选商品,还要能随时更新,当用户决定购买时,用户可以选择决定购买的商品进入结算页面。
功能要求:
- 要持久化,保存到数据库中(定时同步,也可说不做同步因为数据量特别大)。
- 利用缓存提高性能。
- 未登录状态也可以存入购物车,一旦用户登录要进行合并操作
2.流程图
3.购物车的问题
问题:
1、 cookie被禁了能添加吗?
不能了,给提示
2、 购物车未登录有过期时间吗?已登录后有吗?
可以设置
3、 购物车能添加多少个商品? 20-50 200个
cookie
4、 每个商品最多能加多少件?
200
5、 PC和客户端购物车数据一样吗?
登录一样,未登录不一样
6、 未登录情况下 A用户在A电商 添加3个商品 然后 B用户用A电脑又添加2个商品
问 登录B用户的账号 购物车合并的数据是哪个? 不想这样 区分用户?
7、 添加购物车减库存吗?不减
8、 进入购物车列表的时候 验库存吗?验价码?
9、 验价格吗?验
验库存?验
10、购物车里的商品价格变换了有提示吗?库存无货了有提示吗?
有提示。
订单-------------------------------------------------------------------------------------------
当用户点击结算的时候,这块我们用springmvc的自定义拦截器先判断用户是否登录,如果用户没有登录,则跳转到登陆页面,让用户去登录,登录成功之后,跳转到订单结算页面(这块拦截器在跳转到登录页面的时候,把之前的请求地址保存下来,作为参数进行跳转,在登录成功之后,查看是否有请求参数,如果有就跳转到对应的url,如果值为null,跳转到首页);如果用户登录了,则跳转到订单结算页面;
当跳转到订单结算页面的时候,首先对收货人地址进行管理,其次选择支付方式,一期的时候只提供了支付宝支付(建议 微信(二维码自己生成)、支付宝、银联),确认订单信息,然后提交数据到后台,生成对应的订单表、订单详情表和订单物流表(当订单生成的时候,我们要调用对应的库存系统针对订单的商品数量进行锁定,即锁定库存)。当订单创建成功之后,自动跳转到成功页面(将订单数据和到货时间传递过去)。
这块我们设置的订单的有效时间为2天/或者两个小时(这个时间可以自己定,只要合理就行),因为我们***设置了一个定时任务,利用spring task(我们用这个,注解就行了) 或者Quartz(需要配置文件,第三方jar包)***每分钟去检查订单的有效性,如果订单是无效订单,把订单状态修改为关闭订单,当订单为无效订单的时候,我们要释放原来锁定的库存(定时关单)。
问题:
1、 订单表结构(存了什么信息)
2、 订单业务流程
3、 订单有效期(定时关单)??
4、 怎么防止重复提交订单
5、 怎么防止超卖(不许超卖)?
现在 库存就1个商品了 多个用户 同时(没有先后顺序)去下订单 ,你们是怎么做的? 采用数据库锁 ,乐观锁和悲观锁的使用方式
加锁
支付----------------------------------------------------------------------------------(这东西有什么好问的)
支付宝:调接口,调SDK,主要有几个参数:公钥私钥,商户id,我们采用轮训的方式,对支付宝采取回调,把参数传过去,支付宝回调,回调告诉我们成功了。。。
微信:二维码自己生成,前端使用一个插件。。
查看支付日志。日志对照,打客服,有问题,调接口,该状态。。。
问的很loud
问题:
1、 支付需要的参数?
Appid 私钥 公钥 网关(支付支付的接口) 回调路径 订单号 交易号
2、 支付减库存。。。。。。。。
MQ
3、 支付日志 记录了什么东西? 作用是什么?
订单支付的钱,,,,对账,
4、 怎么对账?
人工就行(日志里拿订单编号)
分布式事务-----------------------------事务和关单--------------------------------------------------------
怎么用LCN:
1.创建数据库
2.配置文件,数据库连接信息
3.本地事物和分布式事物
4.引入依赖
5.在启动上加注解,就控制住了(我们只会使用,具体不清楚,阿里的方法,我们老大告诉我们这么用的)
细节:
1 、如何高效完成各个分布式系统的协作
通过消息队列来达到异步解耦的效果,减少了程序之间的阻塞等待时间,降低了因为服务之间调用的依赖风险。
2、消息的弊端?如何解决?(保证:最终一致性)
消息队列的问题在于不确定性,不能绝对保证消息的准确到达,所以要引入延迟、周期性的主动轮询,来发现未到达的消息,从而进行补偿。
生产者-消费者
1.不消费,就存在
2.不管
发送消息::
轮询扫描
1 、应用场景
长期没有付款的订单,要定期关闭掉。
如果时限比较小,比如30分钟未付款的订单就关闭(一般是锁了库存的订单),也可以用延时队列解决。(1天)
如果时限比较长比如1-2天,可以选择用轮询扫描。
2 、实现方式 spring task(定时任务)
轮询扫描有很多工具,比较经典的就是 quartz。
但是springboot整合了自家的spring task ,功能上基本和quartz差不多,但是配置更简单,全程只用注解就可以,不用额外的xml。
3、利用多线程实现异步并发操作(定时关单,,多线程问题)
默认扫描是单线程的即一次任务执行完,第二次的任务才能执行。如果第一次的任务被一些其他情况阻塞住了,那么第二次的扫描就没法开始了。
所以采用线程池,
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
ThreadPoolTaskExecutor
线程池的好处:提高数据处理能力,能够在多并发的情况下,减轻服务器压力,提高性能!(并行,串行),没有安全问题,因为都是关单