今天看了twitter关于cache的策略,领略了cache的威力,抒发了一下情感。
Everything runs from memory in Web 2.0.
优化Cache的策略是为了什么,不外乎三点:
- 减少IO,减少传输,减少CPU计算,减少同时工作的服务器的数量。
- 对结果进行共享,比如搜索,通常我们将关键词和结果串化进行Cache,然后在时间范围内使用Cache来对分享服务器工作结果。
- 更快。这永远都是终极的目标。
通常的架构,对于Cache而言,我们有两层,最前端是一个Page Cache,然后是Memcached,最下来就是Data Pool。

这样的架构下我们能够解决大部分的问题,特别是在处理更多常态化的需求时,访问量平稳,数据提交远小于数据读取。但是这么做有瓶颈特别是对于2.0的网站,我们要应付越来越多的用户数据,要不断的缩短Page Cache的有效时间,我们还得应付更多的异常的流量爆发,于是这样的简单的策略就不顶用了。除非我们不计成本的增加我们的服务器,加大我们的带宽,但也许你的老板会说找你还不如请IDC的人吃饭。我们是架构师嘛,为了不让老板这么说,那我们就得找出策略来。
对于无穷无尽的用户数据的提交,我们通常会想到MQ。说说MQ是个什么东西。他是一种消息队列的处理方式,消息列队是分布式应用间交换数据的一种技术,队列被存在磁盘或者RAM里,队列里面是消息,消息直到它被app读走才被删除。这种机制使得app可以独立的运行,它们不必知道各自的位置和状态,执行过程中也不需要等待其他app的响应。
MQ的最上层是一个消息管理器,下面是队列,队列里存放消息。中间是通道,这里是通道是消息传递的管道,是建立在物理网络中的概念,可以说通道MQ整个概念的精华。通道通常被分为三种,消息通道,MQI,Cluster通道。消息通道是一个单向的通道,有Post, Get, Request, Server等不同的类型,一般是建立在MQ服务器与其他事务服务器之间;MQI是建立在app与MQ之间的,是双向的通道;而Cluster通道则是建立在不同的MQ服务器或者同一MQ集群下的不同消息管理器之间。
MQ的工作原理差不多可以来说。

我们先看看单个系统的情况。app1发送一条消息到MQ,并告诉它消息属于队列1,于是MQ则将消息放到队列1里面,app2便可以读取这个消息然后MQ等待app2读取后把这条消息del掉。
下面这个便要复杂一些。app1发送一条消息到MQ,并告诉它消息属于队列2,然而MQ将消息放到队列2之后发现,这个队列其实是在sysB里面的,这时候MQ会把消息放到一个特殊的传输队列中,然后我们建立一个cluster通道,这个通道更像是一个代理app,这个代理app读到数据并传输到sysB,而在确认sysB真正获取到消息之后MQ才释放掉这条消息。在这里我们意识到MQ在确保消息的准确传输,并且一条消息只有一次这样的传输。

Posts