首页 > 系统服务 > 详细

使用Guava的Cache 和CuratorFramework 建立zookeeper缓存连接池

时间:2021-09-08 20:54:53      阅读:7      评论:0      收藏:0      [点我收藏+]
最近生产遇到了一个问题,java客户端连接zookeeper服务端的时候,连接数超过了最大配置数60。
这个时候定位发现程序创建的zk短链接比较多,所以在增加
zookeeper服务端配置数的时候,同时使用建立Guava的Cache 和Cache 建立zookeeper缓存连接池来减少zk客户端的频繁创建和销毁。
把zk服务的客户端连接数量从之前的60调整为2000.
技术分享图片

 


 

如图:可以看到zk客户端数量过多
技术分享图片

 

 


代码参考如下

@Slf4j @Component
public class ZKUtils {
/**
* 创建关于zookeeper客户端的本地缓存,不适用为分布式服务
*/
private final static Cache<String, CuratorFramework> CACHE = CacheBuilder.newBuilder()

            // 如果key=test的缓存在一天内没有被访问的话,那么1天后就会被清除。
            .expireAfterAccess(1, TimeUnit.DAYS)
            // 设置要统计缓存的命中率
//            .recordStats()
            // 设置缓存最大容量为100,超过1000之后就会按照LRU最近虽少使用算法来移除缓存项
            .maximumSize(100L)
            // 设置缓存的移除通知
            .removalListener((RemovalListener<String, CuratorFramework>) notification -> {
                String key = notification.getKey();
                try (CuratorFramework value = notification.getValue()) {
                    log.info("|缓存移除并关闭成功!|key = {}|移除原因 = {}|", key, notification.getCause());
                }
            }).build();

    /**
     * 创建一个 zk 客户端
     *
     * @return
     */
    public static CuratorFramework getCuratorFramework(IZkConfig zkConfig) {

        String cacheKey = DigestUtil.md5Hex(JsonUtilsGsonImpl.toJson(BeanUtil.beanToMap(zkConfig)));
        String key = StrUtil.format("{}", cacheKey);

        CuratorFramework client;
        try {
            client = CACHE.get(key, () -> {
                CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
                        // zk的server地址,多个server之间用英文逗号隔开
                        .connectString(zkConfig.getZkInfo())
                        // 会话超时时间
                        .sessionTimeoutMs(zkConfig.getSessionTimeout())
                        // 连接超时时间
                        .connectionTimeoutMs(zkConfig.getConnectTiemout())
                        // 失败重试策略
                        .retryPolicy(new RetryNTimes(zkConfig.getMaxRetry(), zkConfig.getSleepTime()))
                        // 独立的命名空间 /namespace
                        .namespace(zkConfig.getRootNamespace()).build();
                curatorFramework.start();
                return curatorFramework;
            });
        } catch (ExecutionException e) {
            log.error(StrUtil.format("|zk客户端创建失败|错误信息 = {}|zkConfig = {}|", e.getMessage(), zkConfig), e);
            return null;
        }

        return client;
    }
}

Guava参考连接:http://ifeve.com/google-guava/

CuratorFramework参考链接:

 

使用Guava的Cache 和CuratorFramework 建立zookeeper缓存连接池

原文:https://www.cnblogs.com/kurl88/p/15239582.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!