node-redis icon indicating copy to clipboard operation
node-redis copied to clipboard

WIP - fix #2141 - cluster redirect if client closed

Open scorpionknifes opened this issue 1 year ago • 0 comments

Description

Here is a rough attempt to resolve issues described in #2141 (I'm not an expert with TS and would like someone to take over this PR)

createCluster is currently unable to update slots when slots are out of date (when a master node goes down and a replica takes over) This causes the client to throw ClientClosedError forever until the application is restarted.

This PR takes inspiration from https://github.com/redis/go-redis

  • Whenever a command is executed, we check if the state has been last updated 10s ago reference
  • Use concept of state struct to make lazy loading easier reference

Related: https://github.com/redis/node-redis/issues/2141#issuecomment-1929245348

Known issues

Do not use isolated - commandOptions; this breaks the client forever, the duplicated client from using this command option would keep using old node addresses and cause Connection timeout on each reconnection. This PR attempts to make changes only to the cluster client and won't make any fixes to this issue (this issue already exists prior this PR) e.g.

await client.xRead(
    commandOptions({
        isolated: true
    }),
    [
        {
            key: key,
            id:'0-0'
        }
    ],
    {
        COUNT: 100,
        BLOCK: 0
    }
);

Try it out

For those interested in trying this client out you can install it using the following:

# I'm using pnpm
"pnpm": {
  "overrides": {
    "@redis/client": "npm:@scorpionknifes/redis-client@^1.6.0"
  }
},

It is available here: https://www.npmjs.com/package/@scorpionknifes/redis-client Reminder - this is a draft and don't use this for production.

Testing

I've tested this against docker, k8s Writing tests for these is almost impossible cause it relies on simulating a Redis master going down. (aka no tests written for these)


Checklist

  • [x] Does npm test pass with this change (including linting)?
  • [ ] Is the new or changed code fully tested?
  • [ ] Is a documentation update included (if this change modifies existing APIs, or introduces new ones)?

scorpionknifes avatar Feb 08 '24 08:02 scorpionknifes