问题 Zookeeper适用于对象缓存吗?


开发一个关注可扩展性的云系统,这意味着系统根据功能边界(usermgmt,ordermgmt,customermgt等)组成基于REST的服务,每个服务都有自己的底层数据库,并且根据负载,可以假设我们可以旋转多个说ordermgmt服务的实例。当ordermgmt服务处理添加订单的请求(代表“客户”)时,它将对customermgmt服务进行REST调用以验证客户等...

由于客户实体不会经常更改,我想知道像ZooKeeper这样的东西是否适合缓存特定客户的实例,即在访问数据库之前,customermgmt服务的多个实例可能会询问。我查看了Zookeeper使用的各种列表,但没有看到任何人使用它进行对象缓存。看起来推荐的znode字节大小约为1K,因此不适合存储脱水对象。此外,不支持GC或LRU开箱即用,所以我也需要添加它。

如果不是Zookeeper,还有更合适的建议吗?我们使用Hibernate作为ORM,但是我们没有很多使用它的经验,虽然它支持一级和二级缓存,但我不确定它们是否在多个服务实例中以分布式/复制方式工作。

谢谢 斯科特


8449
2018-06-11 19:57


起源



答案:


Zookeeper不适合对象缓存。

Zookeeper将整个数据库保存在java堆的内存中。一旦java堆超过千兆字节,你将开始遇到gc暂停的问题。这对动物园管理员来说尤其麻烦,因为动物园管理员节点不断地向对方发送听力,如果在节点忙碌时错过了足​​够的心跳,则会触发领导者选举,使群集下降到最低限度。

使用zookeeper作为缓存的另一个问题是,zookeeper集群中的所有节点都将具有相同的数据,而缓存通常不需要这些数据。

由于存在这些限制,您的3台服务器(每台服务器具有8台内存)可以提供~1 Gig的总工作集。最好使用memcache,或其他一个缓存系统Sebastien列表。


11
2018-06-12 02:37





实际上你可以设置许多不同的技术,分布式或非分布式,作为Hibernate的L2缓存。

  • 的Ehcache
  • Memcached的
  • 的JCache
  • Hazelcast
  • Infinispan的
  • 红陶
  • Gigaspaces XAP
  • 的GemFire
  • 相干性

最后一个,称为datagrids,通常不是免费的,我认为你不需要一个完整的数据网格只是为了l2缓存。

我从来没有使用它,但我不认为Zookeeper被用作分布式缓存。


4
2018-06-11 21:24