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