thunks/thunk-redis

无法评价的项目

xxxman2008 opened this issue · 10 comments

我没去测试过速度如何,我之所以尝试这个 project 是因为 node-Redis 不能支持 cluster。

OK ,粗略的看了一下 代码:

1、所谓的 maxAttempts 就是个废物,反正无论你想不想,代码都会 reconnect
2、如何回收 client ???有 api 么??没有。。。也就是说,client 无法清理。。
3、有 connection pool 么。。对不起 。。没有 。。。
4、。。。。

杂乱无章 的 error 。。。随意乱抛。盲目的API 规划。

如果为了满足单一一个项目的需求而写,恭喜你,你完成了。可能完成的还挺好。

作为一个库项目而写。。无法评价了。。

zensh commented

你会不会写JavaScript啊,不会不要瞎评价啊

我讲的已经比较客气了。
不服气是吧,OK ,

1、maxAttempts 。。。我现在希望 在 client 连接出现错误以后 ,代码不要 reconnect ,请告诉我,你的代码能不能实现? 我现在希望 client 无限期的 永不停止的 reconnect ,请告诉我 ,你的 代码能不能实现 ??
如果不能实现,你 maxAttempts 做什么用?????放着好看么??

2、现实环境里面,我可能 会动态的 调整 redis cluster 中的 服务器,比如。。增加新的 节点,去除硬件配置逐渐落后的节点 。。。OK ,这个时候 ,必然涉及 client 的 清理。。原先连接到 某个IP 的 client 现在要被 回收 。
请告诉我 。是不是等待 20次重试完毕 再来回收 ???

zensh commented

小伙子,感觉你不太像写 JS,你看不懂代码,之前写 PHP?我解答一下你的疑问:

  1. maxAttempts 是肯定起作用的,目前默认值和最大值都是 20(再大没意义),连接 20 次失败后就会 close,你连到一个远程的 redis,然后掐断本机网络试一试:
var redis = require('thunk-redis')
client = redis.createClient('192.168.0.100:6379', {maxAttempts: 3})

client.on('reconnecting', console.log.bind(console, 'reconnecting'))
  .on('error', console.log.bind(console, 'error'))
  .on('close', console.log.bind(console, 'close'))

会出现三次 'reconnecting' 和 'error',然后是重连失败的 'error',最后是 'close' 事件

  1. 什么叫回收 client?关闭连接可以调用 redis 命令 quit 或者 thunk-redis client 自有方法 clientEnd,前者只会关闭 redis 对应的 connection,后者可关闭该 client 所有 connection(cluster 模式下很有用)
  2. connection pool?redis 单节点模式下,一个 client 只需要一个 connection,cluster 模式下,一个 client 会与每个节点生成 connection。并且 cluster 模式下,connection 是自动管理的。也就是说你新增加节点或者停掉老的节点,都会自动识别,并且会有相应的事件警告,不需要你手动管理哦,并且期间发生的 redis 命令也不会丢失(其它客户端应该做不到这点)!
  3. error 随意乱抛?抱歉,你真的不会写 JS,对异常的管理,大概是我写 JS 程序最大的心得。
zensh commented

还有一个 API 规划问题

目前 client 自有的方法(不是 redis 命令)都是以 client 开头,并且只有 clientSwitch, clientUnref, clientEnd, clientState, clientCommands 这几个,除了 node.js 特有的 onemit,其他的都是 redis 命令!
其中 evalauto 是本客户端自定义的命令,为了解决 cluster 模式下使用 lua 脚本的问题,其他的都是 redis 原生命令。这怎么就盲目了?
其他客户端还添加了一些自定义命令或修改了 redis 原生命令的语义呢。

3、有 connection pool 么。。对不起 。。没有 。。。

。。。为何要实现连接池,确定是在看 redis client 吗?

嗯。OK ,

请 说明 1、maxAttempts 。。。我现在希望 在 client 连接出现错误以后 ,代码不要 reconnect ,请告诉我,你的代码能不能实现? 我现在希望 client 无限期的 永不停止的 reconnect ,请告诉我 ,你的 代码能不能实现 ??

作为一个 库项目,我不需要你 来管 reconnect ,我需要自己实现 reconnect。。。

小伙子。。你管的太宽了。。。

其次。。。目前默认值和最大值都是 20(再大没意义)------ 再次说明,作为一个库项目,你管的 太宽了。。我大致上看了一下你的代码 ,20次,等比1.2倍时间 。。如果 你基础数值是 1秒 后连接。。那么20次 也就是 才 225秒。。4分钟不到 。。。“我现在希望 client 无限期的 永不停止的 reconnect ,请告诉我 ,你的 代码能不能实现 ??” 。。。

你不需要 说 你 的 代码会不会close,你只要告诉我 。。按照设计逻辑 ,用户需要自己定义 ”reconnect“ 的 行为模式 ,你现在能不能做到????
我可以 很肯定的告诉你 。。。你做不到 。。无论如何你的 代码 都会 ”强制性的,代表用户的“ 去 进行 20次 重连。。。

你见过哪个库项目会这么干???

”连接 20 次失败后就会 close,你连到一个远程的 redis,然后掐断本机网络试一试“ 。。。。嗯。。这个我没有试过 。。但是,我试过的是 ” 我首先连接一个远程的已经关闭的redis“,也就是说 ,在一开始,连接就不会建立成功 。。。在现实里面 。。可能这个时候 服务器正在重启 。或者是其他情况 。。。请告诉我 ,你有没有 考虑过这种情况 。。。回答yes or no 就可以了。。如果没有考虑过 。。还谈什么 ”对异常的管理,大概是写 JS 程序最大的心得“。。

至于 connection pool ,你不实现,的确也无所谓。。OK 。。用户自己实现好了。。为什么要有 connection pool 。。。呵呵。。基础问题。不普及了。

@xxxman2008 我回了一句又不想掺和, 就删了, 没想到直接默认订阅了回复. 邮件收到这个回复让我再次忍不住了: 你会 js 么? 有 emit , 你想要的 reconnect 都不用改这个库, 几行代码就可以实现, 更不用说这是开源看着不爽改几行源码会死? 有你这打字的功夫, 早就写完了!!

X 。怎么改???他库上面 已经 不断的 去重试了 。。。怎么改??几行代码。。OK ,你来告诉我 。。请你 浪费几分钟时间,写 ”几行代码“,告诉我一下。。。

if (++this.attempts <= options.maxAttempts) {
this.rescuePending()
this.retryDelay *= 1.2
if (this.retryDelay >= options.retryMaxDelay) {
this.retryDelay = options.retryMaxDelay
}

setTimeout(function () {
  debugSocket('socket reconnecting, %s', ctx.id)
  ctx.connect()
  ctx.redis.emit('reconnecting', {
    delay: ctx.retryDelay,
    attempts: ctx.attempts
  })
}, this.retryDelay)

} else {
this.tryRemove(new Error(this.id + ' reconnecting failed'), true)
}

++this.attempts <= options.maxAttempts 本意是判断 是否达到 maxAttempts 的限制。。。OK ,如果达到了 ,那么这是一个程序的 正常 behaviour 。。。作者居然抛 Error ????? 一个 正常的 ,符合设计目标的行为。。要抛Error???

技术问题的探讨我觉得挺好,但是没礼貌的话让他滚就是了。