现成的分布式K/V缓存已经有很多的实现,最主要的比如redis,memcached,couchbase。那为什么我们还要自己去实现呢,在我们解决了分布式系统下大量rpc调用导致的高延时后,我们发现很多服务需要大量的访问分布式缓存,由于分布式缓存通常部署在单独的服务器中,在lan中,通常单次网络也需要1ms,一个请求少的可能需要一两次缓存访问,复杂的服务比如委托、出入金、融资等会访问一二十次,即使程序已经优化,但仅访问分布式缓存花费的网络延时占据了整个响应时间的很大一部分比例,而这些需要广泛被访问的数据通常数据量本身并不大,因此我们将其优化为本地缓存,而使用本地缓存需要解决各应用服务器之间的同步问题,以及分布式系统下节点自动加入的问题。

ehcache是一种最广泛被使用的本地缓存之一,虽然其支持集群,但在分布式环境下不足以灵活,使用ehcache作为分布式系统下缓存的相关不足之处可参考http://blog.sina.com.cn/s/blog_6151984a0101816j.html,另外新的节点加入后如何同步过去也是个问题,很有可能类似于Galera的SST机制。

基于上述考虑,我们不得已自行实现一种解决上述问题的分布式系统下JVM缓存同步实现。

使用手册
0、总体的设计以及需求可以参见《基于rabbitmq的分布式jvm同步方案.pptx》中的详细说明,见http://pan.baidu.com/s/1bpmfHoF。
系统依赖
1、安装rabbitmq 3.5.x。
2、基于jdk 1.7。
3、基于spring 3.2.x。

1、引入jar包com.medsoft.dlcache  http://pan.baidu.com/s/1c2sjruo
2、确保通过spring PropertyPlaceholderConfigurer注入以下三个属性
localcache.isDist,true/false,默认true,可选
localcache.publishExchanges,本节点将发布的消息所属的目标exchange列表,逗号分隔
localcache.subscribeExchanges,本节点将订阅的消息所属的目标exchange列表,逗号分隔
localcache.host,rabbitmq主机地址
localcache.port,rabbitmq主机端口
localcache.username,rabbitmq用户名
localcache.password,rabbitmq密码

Spring需要定义一个com.rabbitmq.client.ConnectionFactory实现,如下所示:
<bean id="rabbitConnectionFactory" class="com.rabbitmq.client.ConnectionFactory">
<property name="host" value="${rabbitmq.host}"></property>
<property name="port" value="${rabbitmq.port}"></property>
<property name="username" value="${rabbitmq.username}"></property>
<property name="password" value="${rabbitmq.password}"></property>
</bean>

3、缓存名为要缓存的POJO的fully qualified name比如com.hundsun.hitop.base.meta.pojo.Param,POJO必须实现CacheEntry接口

4、对于受众范围不同的缓存,划分到不同的rabbitmq exchange,具体见5。

5、缓存API说明
5.1 缓存读写接口为LocalCacheService
• CacheEntry getCacheEntry(String cacheName, String key):获取缓存条目
• boolean saveCacheEntry(String cacheName, CacheEntry cacheEntry):新增或修改缓存条目
• boolean removeCacheEntry(String cacheName, String key):删除缓存条目
• Map<String, CacheEntry> getCache(String cacheName):获取整个缓存
• boolean replaceCache(String cacheName,ConcurrentHashMap<String, CacheEntry> cache):替换整个缓存
• boolean replaceCache(String cacheName,List<CacheEntry> caches):替换整个缓存

5.2 缓存初始化接口AbstractLocalCacheInitializer,需实现List<CacheEntry> loadData()接口,因为设计时考虑的是展现层和服务层是分布式部署的,同时展现层不不能访问DB,所以在实现时为了保证RPC连接已经建立,实现了ApplicationListener接口。所以对于loadData()接口的实现,需要分两种情况:
• 如果是展现层,则通过某种RPC协议调用服务层的接口来加载数据,对于恒生T2而言,则是调用服务层的T2服务加载数据即可。
• 如果是服务层,直接实现DAO即可。

5.3 展现层->服务层分布式体系下应用启动顺序
先启动服务层,次启动展现层,否则会导致失败。

j2ee分布式缓存同步实现方案dlcache v1.0.0的更多相关文章

  1. j2ee分布式缓存同步实现方案dlcache v1.0.1

    j2ee分布式缓存同步实现方案dlcache v1.0.1 发布 修复问题: 1.支持两个层次的缓存,典型的用于产品大类.产品小类,数据字典以及子项: 更新后见: pan http://pan.bai ...

  2. j2ee分布式缓存同步实现方案dlcache

    现成的分布式K/V缓存已经有很多的实现,最主要的比如redis,memcached,couchbase.那为什么我们还要自己去实现呢,在我们解决了分布式系统下大量rpc调用导致的高延时后,我们发现很多 ...

  3. 分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型

    分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型   分布式缓存特性: 1) 高性能:当传统数据库面临大规模 ...

  4. .net core中的分布式缓存和负载均衡

    通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性,缓存对不经常更改的数据效果最佳,缓存生成的数据副本的返回速度可以比从原始源返回更快.ASP.NET Core 支持多种不同的缓存,最简 ...

  5. 三点须知:当我们在开发过程中需要用到分布式缓存Redis的时候

    当我们在开发过程中需要用到分布式缓存Redis的时候,我们首先要明白缓存在系统中用来做什么? 1. 少量数据存储,高速读写访问.通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的 ...

  6. 项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加)

    需求   在整理文件和一些其他头文件的时候,需要对其名称进行整理和修改,此工具很早就应该写了,创业后,非常忙,今天抽空写了一个顺便提供给学习.   工具和源码下载地址   本篇文章的应用包和源码包可在 ...

  7. NCache实现Oracle数据与分布式缓存数据同步的3个步骤

    多层次结构的应用程序是目前发展的趋势,这种程序都需要庞大的数据库支持.而数据传输的能力直接影响程序性能,成为程序可扩展性的瓶颈.因此很多开发者开始在程序中使用内存分布式缓存来提高程序性能. 同时,内存 ...

  8. 经典面试题:分布式缓存热点KEY问题如何解决--有赞方案

    有赞透明多级缓存解决方案(TMC) 一.引子 1-1. TMC 是什么 TMC ,即"透明多级缓存( Transparent Multilevel Cache )",是有赞 Paa ...

  9. 分布式缓存系统 Memcached 半同步/半异步模式

    在前面工作线程初始化的分析中讲到Memcached采用典型的Master_Worker模式,也即半同步/半异步的高效网络并发模式.其中主线程(异步线程)负责接收客户端连接,然后分发给工作线程,具体由工 ...

随机推荐

  1. 网友对twisted deferr的理解

    事實上Deferred的確就像是一連串的動作,用callback的形式被串在一起,我們用deferred或許可以這樣寫 d.addCallback(洗菜)d.addCallback(切菜)d.addC ...

  2. Python初学者需要注意的问题

    一.注意你的Python版本 Python官方网站为http://www.python.org/,当前最新版本为3.4.0 alpha,稳定版本为3.3.2,在3.0版本时,Python的语法改动较大 ...

  3. 安装cvxpy遇到的问题与解决方案(ubuntu14.10,python 2.7.8)

    应该说,cvxpy的安装说明是很棒的,一步一步非常清楚,www.cvxpy.org/en/latest/install/index.html 可是,我照着做完之后,还是不能import cvxpy,不 ...

  4. Android Material Design控件学习(一)——TabLayout的用法

    前言 Google官方在14年Google I/O上推出了全新的设计语言--Material Design.一并推出了一系列实现Material Design效果的控件库--Android Desig ...

  5. Exploring Ionic Lists

    Infinite Lists 由于手机不适合使用多页面显示posts,Infinite Lists成为各种新闻.咨询类app的标配.为了在ionic框架中使用到Infinite Lists,我们首先学 ...

  6. easyui filebox 浏览图片

    <img id="image1"/> <input id="f1" class="easyui-filebox" name ...

  7. Routine Problem(数学)

     Routine Problem time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  8. CyanogenMod wiki reading tips | Android tips

    To Enable the Developer and Performance settings on CyanogenMod 10.1 In the Settings app, choose the ...

  9. iOS开发工具——网络封包分析工具Charles

    简介 Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Charles通过将自己设置成系统的网络访问代理服务器,使 ...

  10. 介绍cms

    在这篇文章中,我们先来定义下什么是CMS(Content Management System)系统,在网站中它是如何帮你来变更内容的. 最后我将展示如何登录Umbraco系统. 简单来说CMS是一个系 ...