j2ee分布式缓存同步实现方案dlcache v1.0.0
现成的分布式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的更多相关文章
- j2ee分布式缓存同步实现方案dlcache v1.0.1
j2ee分布式缓存同步实现方案dlcache v1.0.1 发布 修复问题: 1.支持两个层次的缓存,典型的用于产品大类.产品小类,数据字典以及子项: 更新后见: pan http://pan.bai ...
- j2ee分布式缓存同步实现方案dlcache
现成的分布式K/V缓存已经有很多的实现,最主要的比如redis,memcached,couchbase.那为什么我们还要自己去实现呢,在我们解决了分布式系统下大量rpc调用导致的高延时后,我们发现很多 ...
- 分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型
分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型 分布式缓存特性: 1) 高性能:当传统数据库面临大规模 ...
- .net core中的分布式缓存和负载均衡
通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性,缓存对不经常更改的数据效果最佳,缓存生成的数据副本的返回速度可以比从原始源返回更快.ASP.NET Core 支持多种不同的缓存,最简 ...
- 三点须知:当我们在开发过程中需要用到分布式缓存Redis的时候
当我们在开发过程中需要用到分布式缓存Redis的时候,我们首先要明白缓存在系统中用来做什么? 1. 少量数据存储,高速读写访问.通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的 ...
- 项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加)
需求 在整理文件和一些其他头文件的时候,需要对其名称进行整理和修改,此工具很早就应该写了,创业后,非常忙,今天抽空写了一个顺便提供给学习. 工具和源码下载地址 本篇文章的应用包和源码包可在 ...
- NCache实现Oracle数据与分布式缓存数据同步的3个步骤
多层次结构的应用程序是目前发展的趋势,这种程序都需要庞大的数据库支持.而数据传输的能力直接影响程序性能,成为程序可扩展性的瓶颈.因此很多开发者开始在程序中使用内存分布式缓存来提高程序性能. 同时,内存 ...
- 经典面试题:分布式缓存热点KEY问题如何解决--有赞方案
有赞透明多级缓存解决方案(TMC) 一.引子 1-1. TMC 是什么 TMC ,即"透明多级缓存( Transparent Multilevel Cache )",是有赞 Paa ...
- 分布式缓存系统 Memcached 半同步/半异步模式
在前面工作线程初始化的分析中讲到Memcached采用典型的Master_Worker模式,也即半同步/半异步的高效网络并发模式.其中主线程(异步线程)负责接收客户端连接,然后分发给工作线程,具体由工 ...
随机推荐
- Spark源码系列(二)RDD详解
1.什么是RDD? 上一章讲了Spark提交作业的过程,这一章我们要讲RDD.简单的讲,RDD就是Spark的input,知道input是啥吧,就是输入的数据. RDD的全名是Resilient Di ...
- iOS开发-NSDate使用
时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)至当前时间的总秒数.它也被称为 Unix 时间戳(Unix Timestamp). 下面是iOS中时间戳 与 时间之间的转换方法: ...
- c# C++接口封装 汽车模拟仿真
struct PinCamParIn//用户输入的针孔相机参数结构体{ char CameraName[512]; float Offset[3]; float Angle[3]; ...
- 七牛portal可用性测试记
引言:2013年年底应七牛公司朋友的邀请,给他们的Portal进行可用性测试.七牛(http://www.qiniu.com/)一直专注于云存储基础服务,在业内颇有声誉.七牛云存储的后台选用并不常用的 ...
- Android中使用POI加载与显示word文档
最近打算实现一个功能:在Android中加载显示Word文档,当然这里不是使用外部程序打开.查看一些资料后,打算采用poi实现,确定了以下实现思路: 将ftp中的word文档下载到本地. 调用poi将 ...
- JavaScript 中介者模式与观察者模式有何不同?
http://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailmvp 感觉二者非常像,都是pub/sub机制,如何进行区分 ...
- [Design Patterns] 3. Software Pattern Overview
When you're on the way which is unknown and dangerous, just follow your mind and steer the boat. 软件模 ...
- Communication - 01.Foreword
冷落博客已有一年,理由种种,想来是腾出了些时间,但未见得其他方面有了什么可观的进步.打理博客犹如健身,每天不抬几次杠铃活动活动筋骨则憋的荒.消耗了大量的体力,一天下来却倍感清爽,人清爽了做什么都很来劲 ...
- Install Redis on CentOS 6.4--转
Install Redis on CentOS 6.4 source:http://thoughts.z-dev.org/2013/05/27/install-redis-on-centos-6-4/ ...
- Android 学习笔记之如何实现简单相机功能
PS:看来算法和数据结构还是非常有用的,以后每天都练习两道算法题目...这次忘了对代码进行折叠了..导致篇幅过长... 学习内容: 1.Android如何实现相机功能... 2.如何实现音频的录制.. ...