开发一个关注可扩展性的云系统,这意味着系统根据功能边界(usermgmt,ordermgmt,customermgt等)组成基于REST的服务,每个服务都有自己的底层数据库,并且根据负载,可以假设我们可能旋转说明ordermgmt服务的多个实例。当ordermgmt服务处理添加订单的请求(代表“客户”)时,它将对customermgmt服务进行REST调用以验证客户等...
由于客户实体不会经常更改,我想知道像ZooKeeper这样的东西是否适合缓存特定客户的实例,即在访问数据库之前,customermgmt服务的多个实例可能会询问。我查看了Zookeeper使用的各种列表,但没有看到有人使用它进行对象缓存。看起来推荐的znode字节大小约为1K,因此不适合存储脱水对象。此外,不支持GC或LRU开箱即用,所以我也需要添加它。
如果不是Zookeeper,还有更合适的建议吗?我们使用Hibernate作为ORM,但我们没有很多经验,虽然它支持一级和二级缓存,但我不确定它们是否在多个服务实例中以分布式/复制方式工作
由于 斯科特
答案 0 :(得分:11)
Zookeeper不适合对象缓存。
Zookeeper将整个数据库保存在java堆的内存中。一旦java堆超过千兆字节,你将开始遇到gc暂停的问题。这对于zookeeper来说尤其麻烦,因为zookeeper节点不断地向对方发送听力,如果在节点忙碌时错过了足够的心跳,则会触发领导者选举,使群集下降到momemtarily。
将zookeeper用作缓存的另一个问题是,zookeeper群集中的所有节点都具有相同的数据,通常您不需要缓存。
由于存在这些限制,您的3台服务器(每台服务器具有8台内存)可以提供~1 Gig的总工作集。最好使用memcache,或其他一个缓存系统Sebastien列表。
答案 1 :(得分:4)
实际上,您可以将许多不同的技术(分布式或非分布式)设置为Hibernate的L2缓存。
最后一个叫做datagrids,通常不是免费的,我认为你不需要整个数据网格只是为了l2缓存。
我从未使用它,但我认为Zookeeper不会被用作分布式缓存。