现成的分布式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包https://gitee.com/zhjh256/dlcache
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.1

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

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

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

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

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

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

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

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

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

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

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

  6. Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析

    mongodb和memcached不是一个范畴内的东西.mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据.mongodb和memcached不存在谁替换谁的问题. 和 ...

  7. EhCache RMI 分布式缓存/缓存集群

    EhCache 系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点. EhCache 的主要特性有: 快速.精干 简单: 多种缓存策略: 缓存数据有两级:内存和磁盘, ...

  8. 5个强大的Java分布式缓存框架推荐

    在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的 缓存策略,那么到时候重构起来将会是一个噩梦.本文主要是分享了 ...

  9. 基于redis分布式缓存实现

    Redis的复制功能是完全建立在之前我们讨论过的基 于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生,那么首先要注意你 的 ...

随机推荐

  1. 实践 : Ubuntu 上 Testlink 部署

    1.安装apache sudo apt-get install apache2 2. sudo /etc/init.d/apache2 restart 测试: Http:\localhost or I ...

  2. linux 标准输入输出 重定向

    背景: 屏幕打印不一定都是从标准输出来的,也包括标准错误输出流stderr中的信息 文件描述符定义(系统定义了12个) 0 标准输入 1 标准输出 2 标准错误   0 默认键盘输入 1,2默认从屏幕 ...

  3. python class 1

    //test.py class Employee: 'all employee' empCount = 0 def __init__(self, name, salary): self.name = ...

  4. python对字典及列表递归排序

    对字典内所有内容进行排升序排序,包括,子数组,子字典 需要注意: 1.字典因为是在一定程序上无序的,所以这里采用了内置包,来变成有序字典 from collections import Ordered ...

  5. python+selenium入门

    from selenium import webdriver打开浏览器 driver = webdriver.Chrome() 打开网页 driver.get("http://www.bai ...

  6. mysql 错误2002

    ERROR 2002 (HY000): Can’t connect to local MySQL server throughsocket ‘/tmp/mysql.sock’ (2) 今天遇到的200 ...

  7. RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例

    前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密  私加 ===================== ...

  8. 第四章 CSS3概述

    1.CSS3新增常用选择器(1)结构性伪类选择器:root 文档根元素 :nth-child(n) 第N个子元素"first-child 第一个元素 :kast-child 最后一个子元素 ...

  9. docker-php-ext-install.md(https://gist.github.com/giansalex/2776a4206666d940d014792ab4700d80)

    ```bash RUN apt update RUN apt upgrade -y RUN apt install -y apt-utils RUN a2enmod rewrite RUN apt i ...

  10. mongodb mapredReduce 多个条件分组(group by)

    from:https://my.oschina.net/chiyong/blog/289138 Mongodb 没有传统数据库的group函数,如果分组需要走MapReduce.这种MR与Hadoop ...