45
回答
两级缓存框架 J2Cache 的简单实验
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

今天对 J2Cache 做了最基本的测试,代码已经开放出来,地址是 http://git.oschina.net/ld/J2Cache

补充为什么要做这个框架:

说实话,OSC 现在还是单个 Tomcat,只不过我们做了一些分流措施将爬虫的请求独立运行了。我一直跟人说 OSC 的扩展很容易,只需要加多几个 Tomcat 就搞定了。如果是纯浏览的网站的确是这样的,但事实上并非如此。要让应用工作在集群里,首先 OSC 没用到 session ,这点是满足要求的。但是 OSC 目前使用 Ehcache 作为缓存框架,这是一个进程内的缓存框架,如果集群的话会导致缓存数据不同步。

缓存数据不同步有两个解决办法:

1. 集中式缓存,直接将 Ehcache 换成 Redis 这类产品。如果访问量不大是没问题,访问量大,大量的缓存数据访问使得应用服务器和缓存服务器之间的网络I/O成为瓶颈,这点我有切身之痛。
2. Ehcache 的分布式(我以前专门写过一篇文章),节点间大量的数据复制带来额外的开销,在节点多的情况下此问题越发严重

因此才有了今天的 J2Cache,引入集中式缓存 Redis ,通过进程内的 Ehcache 缓存来缓解网络 I/O 瓶颈。同时也降低集中式缓存服务器的压力。

要对该框架做实验很简单,需要下面几步:

1. 安装个 Redis 服务器
2. 从 http://git.oschina.net/ld/J2Cache 上获取整个项目源码
3. 修改 src/redis.properties 文件中的 host 和 port 项,值为你的 Redis 服务器的 IP 和 Redis 端口号
4. 执行 build.sh(bat) 命令进行编译
5. 也可直接在 Eclipse 中导入该项目并按第 3 步修改 src/redis.properties 配置
6. 打开控制台窗口,执行 runtest.sh(bat) 启动测试客户端

在我机器上执行第 6 步的结果如下:

7. 打开另外一个终端窗口,重复执行第 6 步

你要愿意的话,可以打开很多个终端窗口来启动一个测试的客户端。

接下来就可以对这个缓存框架进行测试,测试的命令包括 get/set/evict/quit,这几个命令的介绍如下:

set <region> <key> <value> 写入缓存数据 key=value 到 region 区域,例:

> set cache1 key1 oschina.net
Jan 07, 2014 4:16:15 PM net.oschina.j2cache.ehcache.EhCacheProvider buildCache
警告: Could not find configuration [cache1]; using defaults.
[cache1,key1]<=oschina.net

上述输出提示中,已将字符串 oschina.net 写入到 cache1 的 key1 键中。

get <region> <key>  从区域<region>读取键为<key>的缓存数据,例:

> get cache1 key1
[cache1,key1,L1]=>oschina.net
上述命令执行结果显示从 cache1 中读取 key1 的值为 oschina.net,数据存放于 L1,也就是一级缓存 Ehcache 中。

这时候可以在其他的终端上再次执行 get 命令,结果就变成:

> get cache1 key1
Jan 07, 2014 4:19:14 PM net.oschina.j2cache.ehcache.EhCacheProvider buildCache
警告: Could not find configuration [cache1]; using defaults.
[cache1,key1,L2]=>oschina.net

上述的 L2 表示数据来自于二级缓存 Redis,说明第二个测试客户端直接从 Redis 获取到数据。再次执行 get 命令 L2 就变成 L1,说明数据已经在一级缓存 Ehcache 中存在。

最后你也可以手工的清除某个缓存:

> evict cache1 key1
[cache1,key1]=>null
而你将在其他的测试客户端上看到如下输出信息:
Jan 07, 2014 4:22:55 PM net.oschina.j2cache.CacheChannel onDeleteCacheKey
信息: Received cache evict message, region=cache1,key=key1

要退出测试客户端,输入 quit 即可。

另外当 Ehcache 中的某个缓存数据应该时间长失效后,也会自动广播到组里所有节点,通知其清除缓存。

说明一下,Ehcache 本身是支持集群的,但如果缓存更新频繁的话,节点间传输的数据量也会很大。J2Cache 的节点间只传输 evict 命令,例如 A 节点通知 B 节点清除某个缓存数据,因此只需要传递 region 和 key 信息即可。

接下来我们将内部对 OSChina 项目迁移到该框架上进行全面测试。欢迎大家尝试。并给我们提建议:)

举报
红薯
发帖于4年前 45回/17K+阅
共有45个评论 最后回答: 2年前

顶红薯老大。

看之前的描述,osc是用ehcache,单台服务器居然撑住了这么多访问,太给力了。

公司有个小游戏,开发ing,还没上线,就已经开始是分布式架构了,额,我汗。

数据库选用mongodb,抛弃mysql的原因是“mysql性能不行”

杀鸡用牛刀的感觉

额!

--- 共有 9 条评论 ---
罗格林回复 @小偷家的保安 : HttpSession是Java Servlet最早搞出来的,它的问题是用户的状态被保存在了服务器内存里,这样横向扩展会比较麻烦。现在有一些系统提出了无状态服务器模式,比如playframework, 参见http://jto.github.io/articles/play_anatomy_part1_bootstrap/ 2年前 回复
小偷家的保安回复 @罗格林 : 不使用httpsession,如何确定客户端啊 2年前 回复
高跟男爵回复 @罗格林 : session 采用shiro做到与容器隔离不就O了 4年前 回复
紫电清霜回复 @罗格林 : 恩恩。唯一的缺憾就是:在一开始的时候,原型都还没出来,就有“要把架构,性能等设计到宏大和极致”的想法,感觉会拖累开发速度。 4年前 回复
罗格林分布式架构其实不是听起来那么难吧。不要使用httpSession之类的东西,小字串存cookie,大对象放cache,自然而然就可以横向扩展了。至于mongo我也喜欢用,跟性能关系不大,最重要的是其面向文档的架构让开发简化很多,domain model改起来也方便不少。 4年前 回复
之前用spring data 来封装操作redis  性能必然会有损失 ,呵呵 有时间就拜读下红薯大哥写的  呵呵 感觉应该不错哦
不错。我的做法和红薯差不多,也是用的jredis,封装的越少越好。spring data没用过
--- 共有 2 条评论 ---
八戒_o没太明白 4年前 回复
你是错的我恒对那所有的 东西 都存到 ehcache吗? 用户登录信息类user也存过去?所有都不存到 session就可以了是么? 4年前 回复
靠,我两级缓存都用的ehcache,比如新闻分页,一级缓存存储新闻分页列表id,二级缓存存储新闻单个实体,每次更新挺麻烦。有时间试试你这个
--- 共有 4 条评论 ---
红薯回复 @okk : 我在帖子里补充了为什么要做这个框架的思路 4年前 回复
红薯回复 @okk : 不是,你不太理解这个框架的用途,在这里 Ehcache 的数据和 Redis 几乎是同步的,并非分工不同 4年前 回复
okk回复 @红薯 : 那你准备把单个实体缓存存在redis里,关系放在ehcache,还是?这样重启tomcat的时候,redis就不受影响 4年前 回复
红薯主要用于集群,分布式 4年前 回复
话说OSC的OSCID是通过什么生成的呢?
--- 共有 7 条评论 ---
青木河回复 @tianpeng91 : 去看看OSC开源的runjs系统的源码,你就明白这个OSCID是怎么生成的了 http://git.oschina.net/oschina/RunJS 3年前 回复
lovit回复 @大师兄悟空 : 你这么厉害?还sessionId换个名字,人家压根就不用Session。 4年前 回复
tianpeng91回复 @lovit : 明白,只是用哪些参数去生成比较好而已 4年前 回复
大师兄悟空回复 @红薯 : 有啥稀奇的,不就是sessionId换个名字么, 还装什么(逼)神秘 4年前 回复
lovitSeession中关键的数据序列化存到cookies中了。就是操作的关键数据,如用户Id等,用这个来判断用户的合法性。 4年前 回复
Ehcache, Infinispan 都是单独的 Server 版本吧,将缓存服务中心化。
--- 共有 1 条评论 ---
红薯帖子里已将缓存中心化的缺点了:) 4年前 回复

OSC访问量真有这么大吗?有没有实际测过瓶颈到底在哪里?

我估计是在“动弹”上吧,采用效率低下的轮询方式,而且轮询时间固定20秒,广大程序员屌丝有事没事就开着OSC窗口,很容易造成突发访问量。

--- 共有 3 条评论 ---
Tom-Lin一直有疑惑,为什么“动弹”不用主动推送的方式 4年前 回复
linapex回复 @打杂程序猿 : 不高啊,每天访问峰值 3000左右 4年前 回复
打杂程序猿你去查一下alex oschina 的排名.. 4年前 回复
顶部