jodis

    xiaoxiao2021-03-25  64

    今天读了下jodis的代码。 配合codis使用的。 其主要着眼点是数据源,对jedispool做了封装。 通过zookeeper上注册的codis proxy个数创建相应个数的jedispool封装为RoundRobinJedisPool,并监听节点的变化,proxy的地址会传回来,可以及时增删配置的jedispool。 但不能根据proxy自定义的配置除host,port之外的其他jedispool配置。

    然后每次获取连接的时候就可以做负载均衡了,依次轮询所有jedispool拿连接。

    自己封装codis的客户端时可以参考这个思路。


    Update:

    jodis监听的节点,参见保存在zookeeper的jodis目录下节点数据,再看源码的CodisProxyInfo类,可以知道其监听的是/codis3/codis-demo/jodis。 但这里应该监听的是/codis3/codis-demo/proxy。 proxy在启动后,除非在codis的dashboard界面手动加入此proxy配置的admin地址,否则proxy会一直waiting online。 但/codis3/codis-demo/jodis路径下会新增这个proxy的信息,虽然jodis的源码中判断了proxy是否online,但是就测试来看即使没有在dashboard手动加入此proxy的admin,注册在jodis路径下的proxy信息中的state值仍未onlien,这样判断就失效了。 这样造成的结果是:

    Caused by: java.util.NoSuchElementException: Unable to validate object

    在对象池validateObject逻辑中, codis对jedis的ping命令的返回了异常:

    直到在dashboard添加了admin地址,这段时间应用拿到的连接不可用。 应用还需要自己处理这种异常。

    所以可以修改CodisProxyInfo类,需要proxy_addr字段。 监听/codis3/codis-demo/proxy路径,这样可以避开这个问题。

    转载请注明原文地址: https://ju.6miu.com/read-38000.html

    最新回复(0)