jodis

今天读了下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路径,这样可以避开这个问题。

你可能感兴趣的:(Java)