几种静态化方案的设计及选择。

下面详细分析如何设计静态化架构,首先要考虑方案应该遵循的几个原则,涉及如何回答以下几个问题。

  •     是否一致性Hash分组?做缓存一定是和命中率紧密相关的,命中率和数据的集中度相关,而要让数据集中一致性Hash就是一个必然选择。但是一致性Hash有一个天然的缺陷就是会导致热点问题,当热点特别集中时可能会导致网络瓶颈。
  •     是否使用ESI?ESI对性能有影响,但是他对客户端友好,前端编程也方便。
  •     是否使用物理机?物理机可以提供更大的内存、更好的CPU资源,但是使用物理机也有一些缺点,例如会导致应用急群的相对集中,进而导致网络风险增加。另外对Java系统而言内存增加并不能带来那么大的好处。
  •     谁来压缩、在哪里压缩也是让人比较纠结的问题,增加一层Cache,必然增加了数据的传输,那么谁来压缩就会影响到Cache的容量和网络数据的传输量。
  •     网卡选择?网卡选择其实是个成本问题,避免网络瓶颈可以选择万兆网卡和交换机,但是必然使成本增加。

根据这几个方面的考虑,分别得出如下几个方案。

方案一 采用Nginx+Cache+Java结构的虚拟机单机部署

这种部署结构图如下图所示。

几种静态化方案的设计及选择。

这种方式是最简单的静态化方案,只需在当前的架构上加一层Cache层就行了,网络结构和业务逻辑都不用变化,只需将系统做静态化改造就完成了。他的优缺点如下所示。
优点:

  •     没有网络瓶颈,不需要改造网络;
  •     机器增加,也没有网卡瓶颈;
  •     机器数增多,故障风险减少。

缺点:

  •     机器增加,缓存命中率下降;
  •     缓存分散,失效难度增加;
  •     Cache和JBoss都会争抢内存。

该方案虽然比较简单,但也能够解决热点商品的访问问题,例如做大促时,商品数比较少,在有限内存中仍然能够命中这些商品;另外针对一些恶意攻击也十分有效,这时的命中率能达到90%以上,但是对系统的整体性能没有很多提升。

方案二 采用Nginx+Cache+Java结构的实体机单机部署

该方案的部署结构图如下图所示。

几种静态化方案的设计及选择。

这种方案是在前面的基础上将虚拟机改成实体机,增大Cache的内存,并且采用了一致性Hash分组的方式来提升命中率,这里将Cache分成若干组,这样可以达到命中率和访问热点的平很。他的优点如下:

  •     既没有网络瓶颈,也能使用大内存;
  •     减少Varnish机器,提升命中率;
  •     提升命中率,能减少Gzip压缩;
  •     减少Cache失效的压力。

这是一个比较理想的方案,在正常请求下也能达到50%左右的命中率,对一些基数数据比较小的系统,命中率能达到80%左右,这样的命中率比较理想。

统一Cache层

统一Cache层是个更理想的推广方案,该方案的结构图如下图所示。

几种静态化方案的设计及选择。

将Cache层单独拿出来统一管理可以减少运维成本,同时也方便其他静态化系统接入,还有如下优点。

  •     可以减少多个应用接入使用Cache的成本,接入的应用只维护自己的Java系统就好,不用单独维护Cache,只需关系如何使用,更好的仍更多流量型系统接入使用。
  •     统一Cache易于维护,例如后面加强监控、配置的自动化,统一维护、升级比较方便。
  •     可以共享内存,最大化利用内存,不同系统之间的内存可以动态切换,有效应对攻击情况。
  •     更有助于安全防护。