面试专题-电商项目面试篇

找工作面试的过程中,项目将会是整个流程的核心灵魂,也是能在面试中能让面试官尽快认同你的一个强有力的依据,所以在面试中把电商项目清晰的表述出来是极为关键的。

1.说说你最近做的这个项目的背景,简单的介绍一下你这个项目?

我们公司之前主要以实体店为主,进行批发与零售,业务也相对比较传统。为了适应市场需求,增强公司竞争力,提升业务绩效,另一方面,也为基于互联网的商务模式创新奠定基础。所以开始 xxx 商城建设项目,其中包含商品管理、订单管理、类目管理、客户管理、合作商管理、客服管理、购物平台、内容管理等,很大程度上分担了人工的压力,对提高客户服务效率和客户满意度能够起到较好的作用。(先大体的描述下项目,然后能够挑一两个自己最为熟悉的模块进行叙述)

一定要学会装逼,在描述的过程中引导性的说出项目中的亮点,例如分布式锁,分布式事务

2.本项目提供了哪些模块(功能和服务)

商品模块:其中包括商品管理,类型管理,属性管理,栏目管理等等
订单模块:其中包括下单,退单,库存,收货人信息等
会员模块:会员注册,会员信息管理,会员等级管理,会员权限等
购物车模块:购物车数据存储,增删改查购物车商品,清空购物车等
提交订单页面:提交用户的订单信息, 处理并发问题。
个人中心:包括用户的登录,个人信息的管理,收货地址的管理,用户所下的订单的管理
支付模块:支付方式管理(在线支付、货到付款)等

3.你负责的哪些模块

在项目中主要负责相关功能的开发,主要有:

1) 后台管理系统:主要实现商品管理、商品规格参数管理、订单管理、会员管理等、CMS(内容管理系统)等,并且提供了跨域支持;
2) 前台系统:主要是面向用户访问,使用 js、ajax 进行前后台数据交互(一般是用 json 格式数据返回)
3) 会员登录:提供和用户信息相关的接口,比如说用户注册、查询等接口(登录时需要进行多重验证,特别注意安全方面)
4) 订单功能:主要是提供和订单相关的业务接口,在订单系统了做了严格的数据校验以及高并发写的支持(这里可以说使用队列实现),并且使用了定时器实现对下单的时间控制,比如说关闭超时未付款的订单;
5) 搜索功能:主要是提供商品的搜索,可以采用 solr全文搜索,当然也有其他的搜索方式;
6) 会员系统:主要是维护用户的信息,已购买订单、优惠券、系统消息、修改密码、绑定手机等功能;
7) 缓存:主要是用 Redis 实现,并且对 Redis 做了集群来保证 Redis 服务的高可用(缓存方面除了 redis 外还有 memcached)
8) 支付系统:主要是负责订单的支付、对账等功能,主要是对接了支付宝的接口;

(根据个人的实际情况选择最为熟悉的模块,进行叙述)

4.电商项目的思维图

面试专题-电商项目面试篇_第1张图片

以上是大部分常用模块,如有其它模块自行补充。根据上图的体系架构,一层层的进行归纳记忆,从项目——模块——功能一点点的往深入熟悉记忆,并且加以理解.

5.项目开发流程

面试专题-电商项目面试篇_第2张图片

6.权限管理

包含功能:管理员登录,权限管理(权限管理控制),角色管理,管理员管理
面试专题-电商项目面试篇_第3张图片

7.你们项目里面哪些地方用到多线程?

项目:
秒杀抢购使用了多线程: 场景,我们一共只有100个商品,在最后一刻,我们已经消耗了99个商品,仅剩最后一个。这个时候,系统发来多个并发请求,这批请求读取到的商品余量都是99个,然后都通过了这一个余量判断,最终导致超发。
应对策略1: 全部请求采用“先进先出”的队列方式来处理。那么新的问题来了,高并发的场景下,因为请求很多,很可能一瞬间将队列内存“撑爆”,然后系统又陷入到了异常状态。 放弃 !
应对策略2: 乐观锁,采用带版本号 (Version)更新。实现就是,这个数据所有请 求都有资格去修改,但会获得一个该数据的版本号,只有版本号符合的才能更新成功, 其他 的返回抢购失败。 这样的话,我们就不需要考虑队列的问题。

8. 你项目对于订单是怎么处理的,假如一个客户在下订单后没有购买怎么办,对于顾客在购买商品的时候你们怎么处理你们的库存?

我们都经常在淘宝上买东西,当我们提交订单后,如果某个时间段之内我们没有支付,淘宝肯定不会帮我们一直保留那个订单,如果超过半个小时我们未支付的话,淘宝会自动帮我们取消订单。在没有用RabbitMQ消息队列之前,我们可以通过设置一个定时任务,设定一个定时规则去轮询数据库查询超过半个小时而且未支付的订单,然后修改订单状态为已取消,这也是一个解决方案,但是需要轮询数据库,增加了对数据库的压力。

其实这种场景可以使用死信队列来做,就是用户提交订单之后,发送一条消息并且设置消息过期时间为半个小时(或其他时间),如果超过设置的这个时间,那么消息自动变成死信,就会被转发到死信队列中,这时候我们可以监听死信队列中的消息,然后查询一下订单的状态,如果还是未支付的话,那么更新订单的状态为已取消。

1、下单后商品进入购物车, 库存减, 会有一个状态, , 时间为半小时, 超时后自动取消, 库存加
2、用户付款,库存减

9.你平时测试的流程?

需求下来时,会先开发Dao层-service层-controller层
当持久层与业务层写完时,会使用Junit测试业务实现
然后开发页面及action,在进行本地测试。
(自测通过后)上传公司内部服务器,测试人员会进行第二轮测试。
(测试通过后)会走脚本,进行抗压访问测试。

10.RabbitMQ在项目中如何应用的?

用户的请求数据直接写入数据库,在高并发的情况下,会对数据库造成巨大的压力,同 时也使得系统响应延迟加剧。在使用ActiveMQ后,用户的请求发给队列后立即返回(当 然不能直接给用户提示订单提交成功,提示:您“您提交了订单,请等待系统确认”), 再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列的 服务处理速度远快于数据库,因此用户的响应延迟可得到有效改善。

11.RabbitMQ如果数据提交不成功怎么办?

我们会重新发送消息,并记录日志,一般重新发送三次,如果仍然失败,我们会邮件或 短信通知相关人员进行处理。

12. solr怎么设置搜索结果排名靠前(得分)?

Solr内改变打分规则有几种形式:
1.配置solr的solrconfig.xml中edismax,来改变Boost打分规则
2.在solr的schema中增加一个字段,该字段专门用于排序
3.自写一个solr的评分规则。
一般简单的应用1和2就能满足。
举一个例子,电商类网站(比如淘宝)的商品搜索:
1.在商品名称上出现搜索关键字排序靠前,而内容的次之
2.对多皇冠的买家排序靠前等
3.对近期发布的商品排序靠前
4.对最近销售多商品靠前
综上获得一个综合排名

13.忘记密码找回密码的流程?

在注册的时候会设置找回密码的问题和答案,在非登录状态忘记密码后,需要通过回答问题和答案找回密码。根据用户名找到用户设置的问题,然后回答完问题后,生成一个UUID,缓存在redis中设置有效期,并返回这个UUID。然后前端将这个UUID和新密码传入重置密码的函数,将传入的UUID和之前缓存在redis中的UUID进行比较,如果相同,则对新密码进行md5加密后更新到数据库中。

14.什么是sso系统(Redis实现的,非CAS)

单点登录是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
登录的处理流程:

1、登录页面提交用户名密码。
2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。
3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。
4、使用String类型保存Session信息。可以使用“前缀:token”为key
5、设置key的过期时间。模拟Session的过期时间。一般半个小时。
6、把token写入cookie中。

如何判断是否登录

1.从cookie中取token
2.取不到未登录
3.取到token,到redis中查询token是否过期
4.如果过期,为登录状态
5.没有过期,登录状态

15.购物车逻辑

1、要求用户登录。

2、把购物车商品列表保存到数据库中。推荐使用redis。

3、Key:用户id,value:购车商品列表。推荐使用hash,hash的field:商品id,value:商品信息。

4、在用户未登录情况下写cookie。当用户登录后,访问购物车列表时,

a)把cookie中的数据同步到redis。
b)把cookie中的数据删除
c)展示购物车列表时以redis为准。
d)如果redis中有数据cookie中也有数据,需要做数据合并。相同商品数量相加,不同商品添加一个新商品。

5、如果用户登录状态,展示购物车列表以redis为准。如果未登录,以cookie为准。

16.浏览器跨域问题

跨域是指从一个域名的网页去请求另一个域名的资源。浏览器出于安全的考虑,不允许不同源的请求
JSONP解决AJAX跨域问题:
JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。
它的基本思想是,网页通过添加一个

你可能感兴趣的:(面试题)