美文网首页
groupcache 源码系列七 实例及最终总结

groupcache 源码系列七 实例及最终总结

作者: 合肥黑 | 来源:发表于2019-03-28 17:57 被阅读0次
一、多结点实例

改造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),其余请求都会等待,最终将结果返回给其他请求,使得所有请求能返回一致的结果。
  • 对热点数据进行备份,虽然是一致性哈希,但是对于过热数据,也会进行多节点备份,缓解过热数据访问对节点造成的压力;

相关文章

网友评论

      本文标题:groupcache 源码系列七 实例及最终总结

      本文链接:https://www.haomeiwen.com/subject/ctecbqtx.html