JCS的学习与应用一:JCS谓何?

    

       近期客户经常因为系统响应慢、甚至服务器宕机来发信给我们,当然这做为高优先级的任务,需要立即解决。通过分析应用日志和was日志,发现是出现了并发请求某些复杂数据资源的时候,造成的线程挂起、系统不响应。既然确定了是系统问题,那就得赶紧给出一个可行性解决方案,稳住客户。通过分析异常日志,发现并发的情况是应用在更新缓存信息,或者说是因为缓存失效后应用在重新请求资源。


       应用所用的是JCS缓存机制,我看过cache.ccf缓存配置文件,发现了一些问题,也是在解决问题的过程中,对这个缓存工具进一步了解,发现网络上关于JCS的解答并不多,所以写了一些东西来释疑。


Java Caching System

      JCS是Jakarta的项目Turbine的子项目。它是一个复合式的缓冲工具。可以将对象缓冲到内存、硬盘,同时能对缓冲对象进行生命周期的过期设定,还可以通过JCS构建具有缓冲的分布式构架,以实现高性能的应用。对于一些需要频繁访问而每访问一次都非常消耗资源的对象,可以临时存放在缓冲区中,这样可以提高服务的性能,JCS正是这样一个能够处理高访问低修改数据对象的缓冲工具,对于读操作远远多于写操作的应用性能提高非常显著。


     JCS除了简单的将对象缓冲在内存中以外,还具有几个特性,以适应企业级缓冲系统的需要。这些特性包括时间过期、索引式硬盘缓冲、并行式的分布缓冲等。


内存缓冲

     JCS现在支持两种内存缓冲算法LRU和MRU。通常都是使用LRU(近期最少使用算法)算法:org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache 。


     使用内存缓冲区需要定义缓冲区大小,当超过缓冲区限制时,会将缓冲内容抛弃掉。如果有配硬盘缓冲,则将挤出来的缓冲内容写入硬盘缓冲区。


时间过期

     JCS对于缓冲的对象,可以设定缓冲过期时间,一个对象在缓冲区中停留的时间超过这个时间,就会被认为是“不新鲜”而被放弃。


索引式硬盘缓冲  

     一方面,为了避免缓冲区过大,撑爆虚拟机的内存,另一方面又希望能够缓冲更多的对象,JCS可以将超出缓冲区大小的对象缓存到硬盘上。配置上也比较方便,只需要指定缓冲临时文件的存放目录位置。硬盘缓冲将缓冲对象的内容写到文件上,但是将访问索引保存在内存中,因此也能够达到尽可能高的访问效率。


并行式的分布缓冲(Lateral)

  通常,将对象缓冲在内存中,一方面提高了应用的性能,而另一方面却使得应用不可以分布式发布。因为假设一个应用配置在两台服务器上并行运行,而两台服务器单独缓冲,则很容易导致两个缓冲区内容出现版本上的不一致而出错。一个机器上修改了数据,这个动作会影响到本地内存缓冲区和数据库服务器,但是却不会通知到另一台服务器,导致另一台上缓冲的数据实际上已经无效了。


  并行式的分布缓冲就是解决这个问题。可以通过配置,将几台服务器配成一个缓冲组,组内每台服务器上有数据更新,会横向将更新的内容通过TCP/IP协议传输到其他服务器的缓冲层,这样就可以保证不会出现上述情况。这个的缺点是如果组内的并行的服务器数量增大后,组内的数据传输量将会迅速上升。这种方案适合并行服务器的数量比较少的情况。


Client/Server式的缓冲(Remote)  

      客户/服务端式的缓冲集群。这种方式支持一个主服务器和最高达到256个客户端。客户端的缓冲层会尝试连接主服务器,如果连接成功,就会在主服务器上注册。每个客户端有数据更新,就会通知到主服务器,主服务器会将更新通知到除消息来源的客户端以外的所有的客户端。


  每个客户端可以配置超过一个服务器,第一个服务器是主服务器,如果与第一个服务器连接失败,客户端会尝试与备用的服务器连接,如果连接成功,就会通过备用服务器与其他客户端对话,同时会定期继续尝试与主服务器取得连接。如果备用服务器也连接失败,就会按照配置顺序尝试与下一个备用服务器连接。


  这种方式下,更新通知是一种轻量级的,一个机器上的数据更新,不会把整个数据传输出去,而只是通知一个ID,当远程的其他机器收到更新通知后,就会把对应ID的缓冲对象从本地的内存缓冲区中移除,以保证不会在缓冲区内出现错误数据。


  这种构造需要分别配置客户端和服务器,配置比较麻烦。



       JCS的这些特点都是在cache.ccf配置文件中通过配置来控制的,并且我们也可以通过定制化编码实现对JCS的一些特定缓存对象事件进行监控等等。


     接下来,我会放上一些实例来讲解在项目中如何配置和应用JCS,以及一些注意事项。





你可能感兴趣的:(JCS)