一、请你谈谈对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("/")设置Cookie路径为根路径,通过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中存放多个地址然后程序中通过代码实现随机调用即可