12

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

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

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

谢谢斯科特

4

2 回答 2

13

Zookeeper 不太适合对象缓存。

Zookeeper 将整个数据库保存在 Java 堆的内存中。一旦 java 堆超过一个 Gigabyte 左右,您将开始遇到 gc 暂停问题。这对 zookeeper 来说尤其麻烦,因为 zookeeper 节点不断地相互发送心跳,如果在节点忙于 gc'ing 时错过了足​​够的心跳,就会触发领导者选举,从而使集群暂时停机。

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

有了这些限制,您的 3 台服务器,每台都有 8 gig 的 ram,设法为大约 1 Gig 的总工作集提供服务。最好使用 memcache 或 Sebastien 列出的其他缓存系统之一。

于 2012-06-12T02:37:29.563 回答
4

实际上,您可以设置许多不同的技术,无论是否分布式,作为 Hibernate 的 L2 缓存。

  • 缓存
  • 内存缓存
  • 缓存
  • 榛树
  • 英菲尼斯潘
  • 红陶
  • 千兆空间 XAP
  • 宝石火
  • 连贯性

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

我从未使用过它,但我不认为 Zookeeper 被用作分布式缓存。

于 2012-06-11T21:24:33.350 回答