我们了解一个道理,就是数据的增长是我们必然面对的问题,因为在技术日益变化的当下,我们收集数据的方式和存储及处理技术不断升级,迫使我们面对这一问题,并且,在数据挖掘日益火热的今天,我们也要对这样的问题加以重视,改变在所难免!
我们曾经想过,在极致优化的情况下,一台普通服务器,是可以挖掘出无穷的潜力的,我的们的确曾做到这一点,用一台2万元的设备,承载了同时1万余人的并发,但是随着技术的衍生,我们需要更灵活地处理应用,我们需要更及时的响应速度,我们需要实时地对数据进行分析和处理!这时,我们必然接触一个词汇,集群,今天,咱们就一起搭建一套简单的tomcat集群,为大家揭开这冰山一角。
作用
其实Nginx的作用非常简单,就是做代理服务器,那什么是代理服务器呢?大家看下图:
大家看,图片中间的黄色的机器就是代理服务器,其实代理服务器就是互联网上的访问公司服务器地址的请求,全通过一台机器进行转发,由这台机器去做负载均衡!这种技术,其实早就有了,我们早期上网使用的代理,就是这样的一种实践,当然,这里的Nginx实现的不仅仅是转发代理,还为提供持久稳定的服务做了很多努力。
原理
多进程模型
在nginx中,这种多进程结构以前只是在理论上听过,现在知道了见到了真实的实现,那么,这和多线程有哪些区别呢,咱们通过网上的一个表格说明:
对比维度 |
多进程 |
多线程 |
总结 |
数据共享、同步 |
数据共享复杂,需要用IPC;数据是分开的,同步简单 |
因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂 |
各有优势 |
内存、CPU |
占用内存多,切换复杂,CPU利用率低 |
占用内存少,切换简单,CPU利用率高 |
线程占优 |
创建销毁、切换 |
创建销毁、切换复杂,速度慢 |
创建销毁、切换简单,速度很快 |
线程占优 |
编程、调试 |
编程简单,调试简单 |
编程复杂,调试复杂 |
进程占优 |
可靠性 |
进程间不会互相影响 |
一个线程挂掉将导致整个进程挂掉 |
进程占优 |
分布式 |
适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单 |
适应于多核分布式 |
进程占优 |
关于孰优孰劣,这是个问题,但是,这不是困恼我们前进的石头,咱们一般是根据情况进行选择,这里不过多讨论,有时间咱们针对这个方向讨论。而在ngnix中,woker进程主要用来处理网络事件,各个woker进程之间是对等且相互独立的,它们同等竞争来自客户端的请求,一个请求只可能在一个woker进程中处理,woker进程个数一般设置为机器CPU核数。
非阻塞结构
一个生活中的实际例子,帮助大家理解阻塞是怎么回事
阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。
吃饭的例子:
比如到你某个餐厅点餐,你不知道菜什么时候做好,你又不能干别的事,只能等着。你可以稍事休息(休眠),等待被服务员唤醒(菜已经做好了)。
非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
吃饭的例子:
比如到你某个餐厅点餐,但是你是叫的外卖,你不知道菜什么时候做好,但是你可以干别的事,你可以每隔一段时间看一眼有没有电话,菜好了会叫你来吃(菜已经做好了)
一般阻塞结构,会浪费一部分时间,非阻塞结构会最大效率地完成这部分工作,大家看时间上的进程图:
总结:
Nginx是非常优秀的反向代理实现工具,它非常清亮,大小只又不到2m,却给我们如此简单,实用,高效的提供了优质的服务,这样的设计理念也是我们需要学习的,在以后的产品架构设计中,我们也要秉着这样的一种原则,就是小而美,精且优的原则,将软件打造成艺术品!