面试 — 每日六问 「2」

一、请你谈谈对MQ的理解?以及你们在项目中是怎么用的?

MQ(消息队列)是一种应用程序对应应用程序的通信方法,由于在高并发环境下,由于来不及同步处理,请求往往发生堵塞,通过消息队列,我们可以异步处理请求,缓解系统压力;MQ( Message Queue) ,即消息队列是在消息的传输过程中保存消息的容器。

通俗的说, 就是一个容器, 你把消息丢进去, 不需要立即处理。 然后有个程序去从你的容器里面把消息一条条读出来处理。一般用于应用系统解耦、消息异步分发, 能够提高系统吞吐量。   消息队列 注册用户,发邮件(异步) 登录,发短信通知(异步),加积分(异步) 商品添加,异步更新solr,异步更新静态页面   静态页面—库存—实时性较差 接口,库存修改后,重新生成新的静态页面  

二、请你谈谈对Redis的认识?

Redis是一种基于键值对的NoSQL数据库(非关系型数据库),是一个key-value存储系统。

Redis有两个特点: 高能性:Redis将所有数据都存储在内存中,所有读写性特别高 可靠性:Redis将内存中的数据利用RDB和AOF的形式保存到硬盘中,这样就可以避免发生断点或机器故障时内存数据丢失的问题

功能应用:

1.数据缓存功能,减少对数据库的访问压力

2.消息队列功能(轻量级)

Redis提供了发布订阅功能和阻塞队列功能

3.计数器-应用保存用户凭证

比如计算浏览数,如果每次操作都要做数据库的对应更新操作,那将会给数据库的性能带来极大的挑战 缓存:优化网站性能,首页 (不常变的信息) 存储:单点登陆,购物车 计数器:登陆次数限制,incr 时效性:验证码expire 订单号:数字  

三、redis应用场景场景:

1.缓存数据服务器 SSO单点登录 2.应对高速读写的场景 秒杀高可用 3.分布式锁 秒杀数据一致性 4.数据共享 库存数据

四、请你谈谈单点登录的实现方案?你们怎么包括cookie的安全性?跨域取cookie的问题,你们怎么解决的?

单点登录使用了Redis+Cookie实现 把用户信息放在Redis中,Key作为用户凭证存放在Cookie中放在客户端,通过获取Cookie凭证判断用户是否有登录 Cookie的安全性,我们的凭证是唯一的UUID,使用工具类统一字符串命名,并且设置了Cookie,关闭document.cookie的取值功能 Cookie的跨域问题,在二级域名使用共享Cookie的将多个系统的域名统一作为二级域名,统一平台提供使用主域名,cookie.setPath(“/”)设置Cooie路径为根路径,通过cookie.setDomain(“.父域名”)使得项目之间跨域互相访问他们的Cookie  

五、如何应对高并发问题?

答:1.HTML静态化,消耗最小的纯静态化的html页面避免大量的数据库访问请求 2.分离图片服务器,对于web服务器来说,图片是最消耗资源的将图片资源和页面资源进行分离,进行不同的配置优化,保证更改的系统消耗和执行效率 3.数据库集群和库表散列,数据库集群由于在架构、成本、扩张性方面都会受到所采用的关系型的限制,在应用程序安装业务和功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再进行更小的数据库散列,最终可以再配置让系统随时增加数据库补充系统性能; 4.缓存,使用外加的redis模块进行缓存,减轻数据库访问压力 5.负载均衡,在服务器集群中需一台服务器调度角色Nginx,用户所有请求先由它接收,在分配某台服务器去处理;实现负载均衡:http重定向实现,DNS匹配,反向代理 6.动静态分离,对于动态请求交给Tomcat而其他静态请求,搭建专门的静态资源服务器,使用nginx进行请求分发  

六、Zookeeper应用场景:

答:1.统一配置管理 持久化节点存放配置信息,监听内容修改 2.集群管理 临时节点机器(节点)退出或者加入,Master选举投票 临时顺序节点选举时候直接使用编号最小的即可 3.分布式锁 创建临时节点,创建成功者获得锁,执行业务操作,独占操作 也可以进行顺序执行,通过最顺序临时节点的编号 4.命名服务 /dubbo   /provider:存放服务地址 /consumer:存放消费地址(没实际意义), /conf:存放配置信息 … consumer通过监听provider节点的内容修改实现动态读取地址,并且支持集群,只需要在provider中存放多个地址然后程序中通过代码实现随机调用即可