一、多结点实例
改造groupcache 源码系列四 Sink ByteView的简单例子,放弃掉那些复杂的解析参数,简单粗暴一点:
//本地peer
peers := groupcache.NewHTTPPool("http://127.0.0.1:8001")
//设置集群信息
peers_addrs := []string{"http://127.0.0.1:8001",
"http://127.0.0.1:8002", "http://127.0.0.1:8003"}
peers.Set(peers_addrs...)
http.ListenAndServe("127.0.0.1:8001", nil)
当我访问http://127.0.0.1:8001/config?key=price
,我打印了额外的辅助信息:
look up for price from groupcache
get data from peer: http://127.0.0.1:8002
get data from peer result error dial tcp 127.0.0.1:8002: connectex:
No connection could be made because the target machine actively refused it.
look up for price from config_file
可以看到尝试去8002请求数据,但是那个节点,我们根本没有部署啊。在goland中重新建立一个工程,改一下代码吧,虽然有点麻烦,胜在简单粗暴……
//本地peer
peers := groupcache.NewHTTPPool("http://127.0.0.1:8002")
//设置集群信息
peers_addrs := []string{"http://127.0.0.1:8001",
"http://127.0.0.1:8002", "http://127.0.0.1:8003"}
peers.Set(peers_addrs...)
http.ListenAndServe("127.0.0.1:8002", nil)
仅仅改一下self,并且把自己启动起来,当然不要忘记复制那个groupcache.conf,然后先把8002跑一下试试。如果ok,就去把8001那个工程重启一下,然后重新访问,错误不见了,拿到了正确的数据:
look up for price from groupcache
get data from peer: http://127.0.0.1:8002
get data from peer value: 12
现在有一个问题,如果把第二个工程8002中的groupname改一下,会出现什么情况呢?答案就是8002正常访问,但是8001已经不能通过节点8002拿到数据了,因为GetRequest传的groupname不同了:
look up for price from groupcache
get data from peer: http://127.0.0.1:8002
get data from peer result error server returned: 404 Not Found
look up for price from config_file
二、总结
参考
grgoupcache源码走读(三):groupcache的特性和使用案例
- 只是一个代码包,可以直接使用,不需要单独配置服务器,既是客户端也是服务器端,这主要是因为它既可能直接返回请求的key的结果,也可能将请求转给其他peer来处理。对访问的用户来说,它是服务端,对其他peer来说它又是客户端(稍微有点绕,不明白的看之后的demo吧);
- 分布式缓存,支持一致性哈希,这里主要是通过peers和consistenthash实现的;
- 采用的缓存机制是LRU,LRU主要通过list.List队列来实现的,不支持过期机制;(所以。。是的,如果有长期不用的数据,只能寄希望于缓存满了之后自动剔除队尾了)
- 对于客户端或者使用用户来说,对数据的操作只能get,不支持set,update以及delete;
- 实现了缓存过滤机制(这个概念也是笔者网上看到的), 代码中叫singlefilght;一般情况下,缓存存在被击穿的风险,即大量相同的请求并发访问,如果此时cache miss,那么这些请求都会落地到服务器端的db上,导致db压力过大甚至最终造成整个服务不可用的情况。而singleflight所做的就是针对并发访问的相同miss key,只有一个请求会真正load data(如访问db),其余请求都会等待,最终将结果返回给其他请求,使得所有请求能返回一致的结果。
- 对热点数据进行备份,虽然是一致性哈希,但是对于过热数据,也会进行多节点备份,缓解过热数据访问对节点造成的压力;
网友评论