zoukankan      html  css  js  c++  java
  • 商城问题

    商城类面试问题
    1).网站并发数:
    经过压力测试可以支持3000左右的并发,可以满足目前的业务需求。由于我们的系统是分布式架构,支持水平扩展,如果将来并发量提高的话,可以增加服务器来提高并发量。

    2).人员配置
    产品经理:3人,确定需求以及给出产品原型图。
    项目经理:1人,项目管理。
    前端团队:5人,根据产品经理给出的原型制作静态页面。
    后端团队:20人,实现产品功能。
    测试团队:5人,测试所有的功能。
    运维团队:3人,项目的发布以及维护。

    3).开发周期
    采用迭代开发的方式进行,一般一次迭代的周期为一个月左右。

    4).Sku/spu
    最小库存量单位。
    Sku==商品id

    5).你说你用了redis缓存,你redis存的是什么格式的数据,是怎么存的
    redis中存储的都是key-value格式的。拿商品数据来说,key就是商品id,value是商品相关信息的json数据。

    6).你前台portal采用4台服务器集群部署,那能前台高并发访问性能提上去了,那数据库会不会造成一个瓶颈,这一块你是怎么处理的
    portal系统在高并发的情况下如果每次请求都请求都查询数据库确实会出现数据库的瓶颈。为了降低数据库压力,在服务层会添加一个缓存,用redis实现,这样的话请求先到缓存中查找是否有缓存的内容,如果有直接从缓存中取数据,如果没有再到数据库中查询。这样数据库的压力就不会那么大了。

    7).你购物车存cookie里边 可以实现不登录就可以使用购物车 那么我现在没有登录把商品存购物车了 然后登录了 然后我换台电脑并且登录了还能不能看见我购物车的信息?如果看不到怎么做到cookie同步,就是在另外一台电脑上可以看到购物车信息
    淘淘商城现阶段使用的仅仅是把购物车的商品写入cookie中,这样服务端基本上么有存储的压力。但是弊端就是用户更换电脑后购物车不能同步。打算下一步这么实现:当用户没有登录时向购物车添加商品是添加到cookie中,当用户登录后购物车的信息是存储在redis中的并且是跟用户id向关联的,此时你更换电脑后使用同一账号登录购物车的信息就会展示出来。

    8).如果用户一直添加购物车添加商品怎么办?并且他添加一次你查询一次数据库?互联网上用户那么多,这样会对数据库造成很大压力你怎么办?
    当前我们使用cookie的方式来保存购物车的数据,所以当用户往购物车中添加商品时,并不对数据库进行操作。将来把购物车商品放入redis中,redis是可以持久化的可以永久保存,此时就算是频繁的往购物车中添加数据也没用什么问题。

    9).电商活动倒计时方案
    ​ 确定一个基准时间。可以使用一个sql语句从数据库中取出一个当前时间。SELECT NOW();
    ​ 活动开始的时间是固定的。
    ​ 使用活动开始时间-基准时间可以计算出一个秒为单位的数值。
    ​ 在redis中设置一个key(活动开始标识)。设置key的过期时间为第三步计算出来的时间。
    ​ 展示页面的时候取出key的有效时间。Ttl命令。使用js倒计时。
    ​ 一旦活动开始的key失效,说明活动开始。
    ​ 需要在活动的逻辑中,先判断活动是否开始。

    10).秒杀抢购库存解决方案
    ​ 把商品的数量放到redis中。
    ​ 秒杀时使用decr命令对商品数量减一。如果不是负数说明抢到。
    ​ 一旦返回数值变为0说明商品已售完。

    11).dubbo服务开发流程,运行流程?zookeeper注册中心的作用?
    使用流程:
    第一步:要在系统中使用dubbo应该先搭建一个注册中心,一般推荐使用zookeeper。
    第二步:有了注册中心然后是发布服务,发布服务需要使用spring容器和dubbo标签来发布服务。并且发布服务时需要指定注册中心的位置。
    第三步:服务发布之后就是调用服务。一般调用服务也是使用spring容器和dubbo标签来引用服务,这样就可以在客户端的容器中生成一个服务的代理对象,在action或者Controller中直接调用service的方法即可。
    Zookeeper注册中心的作用主要就是注册和发现服务的作用。类似于房产中介的作用,在系统中并不参与服务的调用及数据的传输。

    12).redis为什么可以做缓存?项目中使用redis的目的是什么?redis什么时候使用?
    ​ 1.Redis是key-value形式的nosql数据库。可以快速的定位到所查找的key,并把其中的value取出来。并且redis的所有的数据都是放到内存中,存取的速度非常快,一般都是用来做缓存使用。
    ​ 2.项目中使用redis一般都是作为缓存来使用的,缓存的目的就是为了减轻数据库的压力提高存取的效率。
    ​ 3.在互联网项目中只要是涉及高并发或者是存在大量读数据的情况下都可以使用redis作为缓存。当然redis提供丰富的数据类型,除了缓存还可以根据实际的业务场景来决定redis的作用。例如使用redis保存用户的购物车信息、生成订单号、访问量计数器、任务队列、排行榜等。

    13).acitveMQ的作用、原理?(生产者。消费者。 p2p、订阅实现流程)
    Activemq的作用就是系统之间进行通信。当然可以使用其他方式进行系统间通信,如果使用Activemq的话可以对系统之间的调用进行解耦,实现系统间的异步通信。原理就是生产者生产消息,把消息发送给activemq。Activemq接收到消息,然后查看有多少个消费者,然后把消息转发给消费者,此过程中生产者无需参与。消费者接收到消息后做相应的处理和生产者没有任何关系。

    14).activeMQ在项目中如何应用的?
    Activemq在项目中主要是完成系统之间通信,并且将系统之间的调用进行解耦。例如在添加、修改商品信息后,需要将商品信息同步到索引库、同步缓存中的数据以及生成静态页面一系列操作。在此场景下就可以使用activemq。一旦后台对商品信息进行修改后,就向activemq发送一条消息,然后通过activemq将消息发送给消息的消费端,消费端接收到消息可以进行相应的业务处理。

    15).activeMQ如果数据提交不成功怎么办?
    Activemq有两种通信方式,点到点形式和发布订阅模式。如果是点到点模式的话,如果消息发送不成功此消息默认会保存到activemq服务端知道有消费者将其消费,所以此时消息是不会丢失的。
    如果是发布订阅模式的通信方式,默认情况下只通知一次,如果接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的情况。如果要求消息必须送达不可以丢失的话,需要配置持久订阅。每个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时需要配置发送模式为持久化。此时如果客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。

    16).当被问到某个模快存在安全性问题(sso单点登录系统)时,如何回答?
    目前商城的sso系统的解决方案中直接把token保存到cookie中,确实存在安全性问题。但是实现简单方便。如果想提高安全性可以使用cas框架实现单点登录。
    https://www.apereo.org/projects/cas

    17).当技术面试官问到你某个技术点更深层次研究时,自己没有深入了解怎么回答?
    如果没有深入研究就直接回答不知道就可以了。

    18).solr怎么设置搜索结果排名靠前(得分)?
    可以设置文档中域的boost值,boost值越高计算出来的相关度得分就越高,排名也就越靠前。此方法可以把热点商品或者是推广商品的排名提高。

    19).solr的原理
    Solr是基于Lucene开发的全文检索服务器,而Lucene就是一套实现了全文检索的api,其本质就是一个全文检索的过程。全文检索就是把原始文档根据一定的规则拆分成若干个关键词,然后根据关键词创建索引,当查询时先查询索引找到对应的关键词,并根据关键词找到对应的文档,也就是查询结果,最终把查询结果展示给用户的过程。

    20).solr里面IK分词器的原理
    IK分析器的分词原理本质上是词典分词。现在内存中初始化一个词典,然后在分词过程中逐个读取字符,和字典中的字符相匹配,把文档中的所有的词语拆分出来的过程。

    21).支付接口是怎么做的?
    面试中可以说支付这部分不是我们做的,我们项目中并没有涉及支付部分的处理。如果想了解支付是如何实现可以参考之前学过的易宝支付相关处理以及支付宝、微信支付相关文档。
    支付宝:
    https://doc.open.alipay.com/doc2/apiDetail.htm?spm=a219a.7629065.0.0.eeTXH8&apiId=850&docType=4#
    微信支付:
    https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/faq_tmpl

    22).业务如何说?先说业务、说表、说具体实现?
    先说总体的业务流程,然后再说具体业务的实现方法及使用的技术。最后说你在系统中负责的内容。不需要说表结构。

    23).单点登录系统,如果cookie禁用,你们怎么解决?
    如果禁用cookie可以使用url中带参数,把token传递给服务端。当然此方法涉及安全性问题,其实在cookie中保存token同样存在安全性问题。推荐使用sso框架CAS实现单点登录。

    24).你们做移动端没有,如果没有移动端,你们为什么做单点登录?
    单点登录并不是为移动端准备的,移动端有自己的登录方式。单点登录是解决在同一个公司内部多个互信网站之间进行跳转时不需要多次登录,多个系统统一登录入口。

    25).单点登录的核心是什么?
    单点登录的核心是如何在多个系统之间共享身份信息。

    26).除了单点登陆,还做过什么登陆的方式?
    这是什么狗屁问题?除了单点登录那就是普通登录方式,用户在同一个公司的多个系统之间跳转时需要多次登录。

    27).单点登录,http无状态的,别人模仿如何在后端处理
    http是无状态的,如果别人模仿浏览器发送http请求,一般后台是无法识别的。如果对安全要求高的情况下应该是https协议。可以保证在通信过程中无法窃取通信内容。

    28).安全性问题(别的网站使用爬虫技术爬你的网站怎么办?有没有安全措施)
    单位时间内请求次数超过某个阈值就让输入验证码,可以极大降低抓取的速度,如果多次超过某个阀值可以加入黑名单。还有就是页面内容使用json返回,数据经常变一变格式,或者js动态生成页面内容。

    29).商品存入数据库怎么保证数据库数据安全?
    ​ 1.对用户安全管理
    用户操作数据库时,必须通过数据库访问的身份认证。删除数据库中的默认用户,使用自定义的用户及高强度密码。
    ​ 2.定义视图
    为不同的用户定义不同的视图,可以限制用户的访问范围。通过视图机制把需要保密的数据对无权存取这些数据的用户隐藏起来,可以对数据库提供一定程度的安全保护。实际应用中常将视图机制与授权机制结合起来使用,首先用视图机制屏蔽一部分保密数据,然后在视图上进一步进行授权。
    ​ 3.数据加密
    数据加密是保护数据在存储和传递过程中不被窃取或修改的有效手段。
    ​ 4.数据库定期备份
    ​ 5.审计追踪机制
    审计追踪机制是指系统设置相应的日志记录,特别是对数据更新、删除、修改的记录,以便日后查证。日志记录的内容可以包括操作人员的名称、使用的密码、用户的IP地址、登录时间、操作内容等。若发现系统的数据遭到破坏,可以根据日志记录追究责任,或者从日志记录中判断密码是否被盗,以便修改密码,重新分配权限,确保系统的安全。

    30).订单表的数据量太大,我把订单分到许多表中,那么我我想用一条sql查处所有的订单,怎么解决?
    分库情况下:可以使用mycat数据库中间件实现多个表的统一管理。虽然物理上是把一个表中的数据保存到多个数据库中,但是逻辑上还是一个表,使用一条sql语句就可以把数据全部查询出来。
    单库情况下:需要动态生成sql语句。先查询订单相关的表,然后将查询多个表的sql语句使用union连接即可。

    31).咱们单点登录模块中,别人伪造我们cookie中的token怎么办?
    服务端是无法阻止伪造cookie的,如果对安全性要求高的话可以可使用cas框架。

    32).第一个是当两个客户同时买一件商品时库存只有一个了,怎么控制?
    可以使用mysql的行锁机制,实现乐观锁,在更新商品之前将商品锁定,其他用户无法读取,当此用户操作完毕后释放锁。当并发量高的情况下,需要使用缓存工具例如redis来管理库存。

    33).对数据库只是采用了读写分离,并没有完全解决数据库的压力,那么有什么办法解决?
    如果数据库压力确实很大的情况下可以考虑数据库分片,就是将数据库中表拆分到不同的数据库中保存。可以使用mycat中间件。

    34).同一账号以客户端登录怎么挤掉另一端。
    用户登录后需要在Session中保存用户的id。当用户登录时,从当前所有的Session中判断是否有此用户id的存在,如果存在的话就把保存此用户id的Session销毁。

    35).solr的索引查询为什么比数据库要快。
    Solr使用的是Lucene API实现的全文检索。全文检索本质上是查询的索引。而数据库中并不是所有的字段都建立的索引,更何况如果使用like查询时很大的可能是不使用索引,所以使用solr查询时要比查数据库快。

    36).solr索引库个别数据索引丢失怎么办。
    首先Solr是不会丢失个别数据的。如果索引库中缺少数据,那就向索引库中添加。(靠!什么狗屁问题!!!)

    37).Lucene索引优化。
    直接使用Lucene实现全文检索已经是过时的方案,推荐使用solr。Solr已经提供了完整的全文检索解决方案。

  • 相关阅读:
    CountDownLatch、CyclicBarrier、Semaphore的区别
    Java最小堆解决TopK问题
    【转载】缓存穿透,缓存击穿,缓存雪崩解决方案分析
    缓存雪崩问题及处理方案
    memcached 缓存数据库应用实践
    Redis分布式锁的正确实现方式
    JVM垃圾回收--年轻代、年老点和持久代(转)
    策略模式—Java实现(转)
    (转) Redis哨兵的详解
    Hibernate中1+N问题以及解决方法
  • 原文地址:https://www.cnblogs.com/liangxr/p/13888242.html
Copyright © 2011-2022 走看看