被狠虐的问题整理

1. 负载均衡是什么?

答:为解决业务流量越来越大,从而出现的一种将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备的技术。主要是横向扩展。一般分为四层负载均衡和七层负载均衡。
负载均衡基础知识

所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器,通常使用开源软件LVS(Linux Virtual Server)+ keepalived的方式实现。
所谓七层负载均衡,也称为“内容交换”,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器,通常直接使用Nginx配置完成(Nginx配置负载均衡)。


2. Session是什么?Cookie是什么?两者对比。

答:具体来说Cookie机制采用的是在客户端保持状态的方案,而Session机制采用的是在服务器端保持状态的方案。两者存储的都是用户登录信息,操作行为等等的数据。
Cookie一般保存在客户端本地文件中,而Session则默认存在服务器文件中(切记不是内存!例如PHP在php.ini中,默认session.save_handler = files)。
当客户端访问服务器时,服务器根据需求设置Session,将会话信息保存在服务器上,同时将标示Session的session_id传递给客户端浏览器,浏览器将这个session_id保存在内存中(还有其他的存储方式,例如写在url中),我们称之为无过期时间的Cookie。浏览器关闭后,这个Cookie就清掉了,它不会存在用户的cookie临时文件。以后浏览器每次请求都会额外加上这个参数值,再服务器根据这个session_id,就能取得客户端的数据状态。
如果客户端浏览器意外关闭,服务器保存的Session数据不是立即释放,此时数据还会存在,只要我们知道那个session_id,就可以继续通过请求获得此Session的信息;但是这个时候后台的Session还存在,该Session的保存有一个过期时间,一旦超过规定时间没有客户端请求时,服务器就会清除这个Session。

用户首次登录访问

用户二次登录访问


3. 在负载均衡下,怎么保持会话?一般的方案有哪些?

答:

  1. 使用Cookie
    一、用Cookie对用户Session进行保存,当客户端访问分配到不同的服务器时,先判断该服务器是否存这个用户Session,如果不存在则将Cookie中的用户Session存到该服务器中,实现Session会话保持(缺点是Cooike容易被破解,有安全隐患)。
    二、负载均衡服务器在返回请求中植入或重写Cookie,通过该Cookie将来自同一个客户端的请求(例如阿里云,在HTTP/HTTPS响应报文中插入SERVERID字串或Set-Cookie name,用来判断是否同一个用户)定向转发给同一台服务器PS:该方法有一个弊端,如果用户禁用了Cookie则会导致整个会话无法保持。
  2. 使用Nginx
    一、使用ip_hash,将同一客户端的请求一直分配给同一个服务器。使用该方法,容易导致负载失衡,并且要求Nginx必须为最前端的服务器(无法运用于CDN或其他代理)。
    二、使用sticky_cookie_insert,该方法与ip_hash一样,将来自同一客户端的请求被传递到一组服务器在同一台服务器。不同的是,该方法基于Cookie来判断是否同一客户端,可以避免负载失衡的问题。
    三、据说Nginx有一个nginx-sticky-module的第三方模块,也是使用Cookie去处理会话保持,不过没有使用过,原理类似。
  3. 使用LVS
    这个由于没有怎么使用过,先记录一下:使用LVS实现负载均衡原理及安装配置详解
  4. 使用Memcache/Redis/MySQL
    以上三种方法类似,其原理属于会话共享,PHP下,Memcache/Redis直接配置session.save_handler和session.save_path即可使用,而使用MySQL比较容易增加数据库的负荷,不推荐使用。

4. RPC是什么,原理,以及调用过程发生了什么,怎么传输参数?

答:远程调用框架(Remote Procedure Call),是在Socket基础上实现的,一般用于两个服务器间的接口调用。

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

比如A (client) 调用 B (server) 提供的remoteAdd方法:

  1. A和B之间建立一个TCP连接;
  2. A把需要调用的方法名(这里是remoteAdd)以及方法参数(10, 20)序列化成字节流发送出去;
  3. B接受A发送过来的字节流,然后反序列化得到目标方法名,方法参数,接着执行相应的方法调用(可能是localAdd)并把结果30返回;
  4. A接受远程调用结果,输出30。

5. 从输入url到页面加载完成发生了什么?

详细细节可参考:
从输入url到页面加载完成发生了什么?——前端角度
从输入URL到页面加载发生了什么

答:

  1. 浏览器的地址栏输入URL并按下回车。
  2. 浏览器查找当前URL是否存在缓存,并比较缓存是否过期。
  3. DNS解析URL对应的IP。
  4. 根据IP建立TCP连接(三次握手)。
  5. HTTP发起请求。
  6. 服务器处理请求,浏览器接收HTTP响应。
  7. 渲染页面,构建DOM树。
  8. 关闭TCP连接(四次挥手)。

6. PHP中,命名空间是什么?怎么载入某个命名空间下所有文件?

答:命名空间,namespace,封装事务的方法,主要用于解决用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突,相当于文件夹效果,一般配合use 空间\元素 as 别名使用,可以引入不同命名空间下的文件。使用spl_autoload_register()函数,可以自动将use后的空间下的类自动加载。

将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload()函数,它必须显式注册到__autoload()队列中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload()或spl_autoload_call()。
如果需要多条 autoload 函数,spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。


7. MySQL主从数据库原理以及数据同步的方式。

答:

master-slave的体系结构

不管是delete、update、insert,还是创建函数、存储过程,所有的编辑性质的操作都在master上。当master有操作的时候,slave会快速的接收到这些操作,从而做同步。在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);在slave机器上,slave读取主从同步事件,并根据读取的事件变化,在slave库上做相应的更改。


8. 分别阐述下Memcache,Memcached和Redis,以及各自优缺点。

答:

详细细节可参考:
深入理解Memcache原理

  • 在PHP中,Memcache和Memcached其实是两个PECL(The PHP Extension Community Library)扩展,memcache扩展是完全在PHP框架内开发的,memecached扩展则是基于libmemcached的开发的。然后在守护进程方面,Memcache和Memcached的守护进程都叫memcached。
  • Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。Memcache扩展是原生的(基于pecl扩展库)。
  • Memcache是该系统的项目名称,Memcached是该系统的主程序文件(字母d可以理解为daemon),以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,使用共享内存存取数据。
  • Memcache会预先分配内存,使用Slab分配算法保存数据,使用LRU(last recently used)算法淘汰数据。优点是具有极佳的水平扩展性;缺点是无法持久化,并且只能使用key-value的方法存储数据,并且key的最大长度为250个字节value最大存储空间为1M无冗余机制

    Memcache&Memcached


9. PHP多线程是什么?有哪些场景和怎样使用,阐述原理。


10. Swoole框架和扩展。


11. 阐述PHP多继承。


12. RabbitMQ的原理、特性,以及使用场景。


13. 知道哪些设计模式?一般使用场景有哪些?


持续更新ing~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值