以前看zookeeper只知道是在分布式应用程序环境中起到协调通知的作用,但一直都未在具体项目中应用过。正好最近业务中有这样的场景,就拿来实践了一下。
业务场景:通过页面将一些人工配置的数据保存下来,客户端通过服务端暴露的restful接口来请求到这些数据。服务端大约20来个节点,当时考虑通过将数据缓存到redis中,然后每个请求过来直接到redis机器上取数据。这些数据大部分时间不会有太大变化,但人工还有可能随时变更,重新保存,而且客户端过来的请求量很大,并且每次请求里面可能都会循环多次去连redis取。考虑到到redis中取虽然是ms级,但是对于大量请求来说开辟连接、网络io对性能来说也是一笔不小的开销。
考虑使用zk:如果我将这些不是太经常变更的数据直接放进本机的内存对象里面,取的时候读本机内存,那样响应速度将大大提升。但是节点不同,对象也不同,如何保证数据一致。此时可以考虑到zk的监听机制。利用内存对象 、redis、zk实现不同节点数据同步。保存数据时候可以存入redis中,同时创建一个zk临时节点并塞入当前时间戳数据。监听端,创建zk监听机制,当需要人工重新更改配置数据时候,将会引起zk的节点发生变化,此时zk及时监听到通知各节点将redis中最新数据存入各个节点对象中,这样就能保证数据是最新的而且一致性。