作者:Gavin Terrill译者 张龙 来源:InfoQ   酷勤网收集 2008-09-03

摘要
  Ehcache现在已经有了一个Cache Server,它以两种形式出现:适合大多数Web容器的WAR以及独立的服务器。Cache Server有两种类型的API:面向资源的RESTful以及SOAP。这两种API都支持任何编程语言。

EhCache小组的Greg Luck在8月初宣布了针对缓存的SOAP和RESTful APIs。正如文档所述:

Ehcache现在已经有了一个Cache Server,它以两种形式出现:适合大多数Web容器的WAR以及独立的服务器。Cache Server有两种类型的API:面向资源的RESTful以及SOAP。这两种API都支持任何编程语言。

在随后的一个帖子中,Greg简述了部署1TB缓存理论上的方式:

最大的Ehcache单实例在内存中可以缓存20GB。最大的磁盘可以缓存100GB。我们可以将节点整合在一起,这样缓存数据就可以跨越节点,以此获得更大的容量。将缓存20GB的50个节点整合在一起就是1TB了。

第一种、也是最简单的方式就是装配运行着Ehcache Server的几个节点,然后让客户端根据对象的Hashcode来决定使用哪个Server:

String[] cacheservers = new String[]{"cacheserver0.company.com", "cacheserver1.company.com", "cacheserver2.company.com", "cacheserver3.company.com", "cacheserver4.company.com", "cacheserver5.company.com"};
Object key = "123231";
int hash = Math.abs(key.hashCode());
int cacheserverIndex = hash % cacheservers.length;
String cacheserver =cacheservers[cacheserverIndex];

我们使用一个负载均衡器(load balancer)来支持冗余,每个节点运行两个Ehcache Server实例,通过使用现有的分布式缓存方案(RMI或者JGroups)支持节点之间的数据复制。在这种方式下,客户端依旧使用Hashcode来决定使用哪个Server,但是现在我们可以在负载均衡器所分配的虚拟IP后透明地处理失败。

Greg谈到的第三种方式就是转换职责以将请求路由给负载均衡器。

EhCache Server的RESTful版基于Jersey——JSR 311参考实现。Jersey的开发者之一Paul Sandoz谈到了如何使用Jersey的客户端API以访问缓存来创建并得到一个示例XML文档:

// retrieving a node
Node n = r.accept("application/xml").get(DOMSource.class).getNode();
// creating a node
String xmlDocument = "...";
Client c = Client.create();
WebResource r = c.resource(http://localhost:8080/ehcache/rest/sampleCache2/2);
r.type("application/xml").put(xmlDocument);

那么RESTful缓存适合于哪种场景呢?James Webster说已经有越来越多的大公司采取这种架构方式了:

我注意到一些投资银行所采取的架构模式就是一种分布式的内存缓冲,该缓存由RESTful的前端通过HTTP来访问,以得到市场数据(如股票价格、利率曲线,或者诸如表面波动和相互关系之类的引伸价值)和静态数据(如对等细节、结算拖欠)。我们可以“轻松”扩展该分布式缓存以容纳大量数据集,同时前端也允许用其他方式访问数据,只要客户端能访问HTTP就行。

正如James指出的那样,我们想要看看厂商(如OracleGigaspaces)到底要花多久才能在其产品中支持RESTful接口。

查看英文原文:Deploying a 1 Terabyte Cache using EhCache Server
来自:http://www.infoq.com/cn/news/2008/09/restful-ehcache

分类: 系统架构 设计模式

上一篇:关于复杂事件处理和事件驱动架构的争论   下一篇:专访支付宝架构师团队:因为信任,所以简单