Node-redis: рддреНрд░реБрдЯрд┐ рдХреЛ рдлреНрд▓рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж retry_strategy рд░реАрд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рдлрд╝рд░ре░ 2017  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: NodeRedis/node-redis

  • рд╕рдВрд╕реНрдХрд░рдг : рдиреЛрдб_рд░реЗрдбрд┐рд╕ 2.6.5, рд░реЗрдбрд┐рд╕ 3.2.7
  • рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо : рдореИрдХ рдУрдПрд╕ 10.12.3 . рдкрд░ Node.js 7.5.0
  • рд╡рд┐рд╡рд░рдг :

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

const redis = require('redis');

const client = redis.createClient({
  url: 'redis://localhost:6379',
  retry_strategy: options => new Error('Fail')
});

setInterval(() => client.incr('some-key', console.log), 5000);

рд╕реНрдерд╛рдиреАрдп рд░реЗрдбрд┐рд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪрд▓ рд░рд╣рд╛ рд╣реИ ( docker run --rm -p 6379:6379 redis )

рдкрд╣рд▓рд╛ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдбрд┐рд╕ рдХреЛ рдорд╛рд░рддрд╛ рд╣реВрдВред рдЬрдм рдореИрдВрдиреЗ рддреНрд░реБрдЯрд┐ рджреЗрдЦреА рд╣реИ рддреЛ рдореИрдВ рд░реЗрдбрд┐рд╕ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реВрдВред рдХрдиреЗрдХреНрд╢рди рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдСрдлрд╝рд▓рд╛рдЗрди рд╣реИрдВрдбрд▓рд░ рдХреЛ рддреНрд░реБрдЯрд┐ рдлреНрд▓рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдЧрд▓реЗ рдЖрджреЗрд╢ рдкрд░ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдмрдВрдж рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ AbortError рдХреЗ рдмрдЬрд╛рдп new Error('Fail') ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣рд╛рдВ рддреНрд╡рд░рд┐рдд рдЕрдкрдбреЗрдЯред
рдореИрдВрдиреЗ рдЕрдкрдиреЗ enable_offline_queue = false рдХреЛ рдЕрдкрдиреЗ createClient рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд╣реА рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬреЛ рд╣реИ:
" retry_strategy рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЗрд░реЗ рд░реЗрдбрд┐рд╕ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдЬрд╛рд░реА рд░рдЦреЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмреАрдЪ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рддреБрд░рдВрдд рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХ рджреЗрдВред рдлрд┐рд░, рдпрджрд┐ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рдмрд╕ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ ".

FYI рдХрд░реЗрдВ: get рдХреЙрд▓ рдкрд░ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдХреЛ рджреВрд░ рдХрд░рддрд╛ рд╣реИ: AbortError: SET can't be processed. Stream not writeable.

рдбреАрдмреА рдФрд░ рдореЗрд░реЗ рдРрдк рдХреЗ рдмреАрдЪ рд╕реАрдзреА рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЕрдзрд┐рдХ "рдордЬрдмреВрдд" рд╕рдорд╛рдзрд╛рди рд╕рдВрднрд╡ рд╣реИ рдЬрд╣рд╛рдВ:

  • рдХреНрд▓рд╛рдЗрдВрдЯ retry_strategy рдЖрдзрд╛рд░ рдкрд░ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ
  • рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХреЙрд▓/рдЙрдкрднреЛрдХреНрддрд╛/рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рд╣реИрдВрдЧ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ
  • рдХрдорд╛рдВрдб рдХреЛ рдЕрднреА рднреА рдХрддрд╛рд░рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕рд╢рд░реНрдд?)

рд╢рд╛рдпрдж рдпрд╣рд╛рдБ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрдард┐рди рдкрд░рд┐рджреГрд╢реНрдп рд╣реИрдВ ...

рд╕рднреА 21 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

retry_strategy рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ node_redis рдХреЗрд╡рд▓ рддрднреА рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдИ рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдХреЛрдИ рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдЙрд╕ рд╕рдордп рдХреЗ рдареАрдХ рдмрд╛рдж рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд╣реЛрдЧрд╛ред

рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдПрдХ рдЧреИрд░ рдирдВрдмрд░ рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдПрдХ рдЧреИрд░-рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдЧреЗ рдХреЛрдИ рдкреБрди: рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рд╕рднреА рдСрдлрд╝рд▓рд╛рдЗрди рдЖрджреЗрд╢ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░ рдЬрд╛рддреЗ рд╣реИрдВред

рдореИрдВ рдЬрд┐рд╕ рдкреНрд░рд╡рд╛рд╣ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ: рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░, 1 рд╕реЗрдХрдВрдб рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде 3 рдмрд╛рд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрджрд┐ рддреАрд╕рд░реА рдмрд╛рд░ рдпрд╣ рдЕрднреА рднреА рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рднреА рдмрдХрд╛рдпрд╛ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░реЗред

README.md рдореЗрдВ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде, рдЖрдк рдЬреЛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдмрд╛рд░ 3 рдХреЗ рдЕрдзрд┐рдХрддрдо рдкреНрд░рдпрд╛рд╕ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдЧрд▓реЗ рдЖрджреЗрд╢ рдкрд░ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ createClient() рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

const client = redis.createClient({
    url: 'redis://localhost:6379',
    retry_strategy: (options) => {
        if (options.times_connected >= 3) {
            // End reconnecting after a specific number of tries and flush all commands with a individual error
            return new Error('Retry attempts exhausted');
        }
        // reconnect after
        return 1000;
    }
});

рд╣рд╛рдВ, рдореИрдВрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЫреЛрдбрд╝ рджрд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдпрд╣рд╛рдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред

рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ:

let client = createClient();
function createClient () {
  return redis.createClient({
    url: 'redis://localhost:6379',
    retry_strategy: (options) => {
      client = createClient();
      return new Error('Retry attempts exhausted');
    }
  });
}

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореИрдВ рдЕрдм рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЕрдкрдиреЗ рд░реЗрдбрд┐рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛?

рдЖрдк рд░реЗрдбрд┐рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдЯ рд░реИрдкрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

// redisClient.js

let redis = require("redis");

let client = null;

const options = {
    url: 'redis://localhost:6379',
    retry_strategy: (options) => {
        client = null;
        return new Error("Redis client connection dropped.");
    }
};

module.exports = {
    getClient: () => {
        if (client == null) {
            client = redis.createClient(options);
        }
        return client;
    }
};

рдХрд╛рдо рдореЗрдВ рд▓рд╛рдирд╛:

// usage

let client = require("redisClient.js");

client.getClient().get("some key");
client.getClient().set("some key", "some value");

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрдирд░реНрдкреНрд░рдпрд╛рд╕ рд░рдгрдиреАрддрд┐ рдореЗрдВ createClient() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВред

рдпрджрд┐ рдЖрдк getClient() рд╣рд░ рд╕рдордп рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдмрдбрд╝рд╛ рд░реИрдкрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рд░реЗрдбрд┐рд╕ рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдЬреИрд╕реЗ get() , set() , рдЖрджрд┐, рдФрд░ рдЙрди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ getClient() рдХреЙрд▓ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, getClient() рдпрд╣ рд╡рд┐рдзрд┐ рдЙрддреНрд╕реБрдХрддрд╛ рдХреЗ рдмрдЬрд╛рдп рдЖрд▓рд╕реНрдп рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реИред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд┐рд╕реА рднреА рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХреА рд░рдгрдиреАрддрд┐ рдХреНрдпреЛрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдЖрд╡рд░рдг рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реИ?

рдореИрдВ рд▓реЗрдЦрдХ рдирд╣реАрдВ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВ retry_strategy рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреАрдЫреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВред рдиреЛрдб_рд░реЗрдбрд┐рд╕ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП retry_strategy рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрди: рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдХрдореА рд╣реИ, рдЪрд╛рд╣реЗ рдХреБрдЫ рднреА рд╣реЛред рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдореИрдВрдиреЗ рд▓рдЧрд╛рддрд╛рд░ retry_strategy рд╕реЗ рдПрдХ рдирдВрдмрд░ рд▓реМрдЯрд╛рдпрд╛ рд╣реИ рдФрд░ рдХрднреА рднреА рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╣рдореЗрд╢рд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ retry_strategy рдХреЗ рднреАрддрд░ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рдЗрд╕ рдЬреИрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд░рд╛рдп рд╣реИ? https://github.com/viglucci/node_redis/tree/feature-reconnect-after-flush#retry_strategy -example

var client = redis.createClient({
    retry_strategy: function (options) {
        if (options.error && options.error.code === 'ECONNREFUSED') {
            // End reconnecting on a specific error and flush all commands with a individual error
            return new Error('The server refused the connection');
        }
        if (options.total_retry_time > 1000 * 60 * 60) {
            // End reconnecting after a specific timeout and flush all commands with a individual error
            return new Error('Retry time exhausted');
        }
        // attempt reconnect after retry_delay, and flush any pending commands
        return {
            retry_delay: Math.min(options.attempt * 100, 3000),
            error: new Error('Your custom error.');
        }
    }
});

рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕реЗ рджреЛ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

var client = redis.createClient({
  // this strategy handles the pending redis commands when the connection goes down
  flush_strategy (options) {
    if (options.attempt >= 3) {
      // flush all pending commands with this error
      return new Error('Redis unavailable')
    }
    // let the connection come up again on its own
    return null;
  },
  // this strategy handles the reconnect of a failing redis
  retry_strategy (options) {
    if (options.total_retry_time > 1000 * 60 * 60) {
      // The connection is never going to get up again
      // kill the client with the error event
      return new Error('Retry time exhausted');
    }
    // attempt reconnect after this delay
    return Math.min(options.attempt * 100, 3000)
  }
});

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ flush_strategy рдирд╛рдо рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдИ рдХреБрдЫ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдУрд╣ рджрд┐рд▓рдЪрд╕реНрдкред рдЖрдк рдпрд╣рд╛рдВ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд░реНрддрдорд╛рди retry_strategy рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ connection_strategy рдФрд░ рдореМрдЬреВрджрд╛ retry_strategy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ flush_strategy рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рд╣реИред

var client = redis.createClient({
    // this strategy handles reconnection
    connection_strategy (options) {
        if (options.total_retry_time > 1000 * 60 * 60) {
            // The connection is never going to get up again
            // kill the client with the error event
            return new Error('Retry time exhausted');
        }
        // attempt reconnect after this delay
        return Math.min(options.attempt * 100, 3000)
    },
    // this strategy handles the pending redis commands when the connection goes down
    retry_strategy (options) {
        if (options.attempt >= 3) {
            // flush all pending commands with this error
            return new Error('Redis unavailable');
        }
        // let the client attempt the commands once a connection is available
        return null;
    },
});

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд: https://github.com/viglucci/node_redis/tree/feature-connection-strategy#retry_strategy -example

@ рдЬреЗрдирдкреЛрдЯ рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ retry_strategy рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рдХрд▓реНрдк рд╣реИред

@рд╡рд┐рдЧреНрд▓реБрдЪреА рдпрд╣рд╛рдВ рдЙрддреНрддрд░ рджреЗрдиреЗ рдФрд░ рдЕрдЪреНрдЫреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдпрджрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рдореИрдВ рдЬрд▓реНрдж рд╣реА рдПрдХ v3 рд╢рд╛рдЦрд╛ рдЦреЛрд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдБред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрдИ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рдиреА рд╣реЛрддреА рд╣реИ рдФрд░ рд╕рднреА рдмрд╣рд┐рд╖реНрдХреГрдд рдЪреАрдЬреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реЗрдЧреАред

@BridgeAR рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рдЕрднреА, рдЕрдЧрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд░реЗрдбрд┐рд╕ рдХрдиреЗрдХреНрд╢рди рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореЗрд░реЗ рд╕рднреА рдЖрджреЗрд╢ рдмрд╕ рд▓рдЯрдХ рдЬрд╛рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЙрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд▓рдмреИрдХ рд╣реИ рдЬреЛ рд░реЗрдбрд┐рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ рддреЛ рд╡рд╣ рдлрд╝реЙрд▓рдмреИрдХ рднреА рд╣реИрдВрдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдХреБрдЫ рдкреБрдирд░реНрдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж рд░реЗрдбрд┐рд╕ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рдореИрдВ рдлреЙрд▓рдмреИрдХ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдирд┐рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗред Redis рдПрдХ рдорд┐рдирдЯ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдЖрдк рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЖрдкрдХрд╛ рдЧреНрд░рд╛рд╣рдХ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдорд░ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рддрдХ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдЙрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд┐рд╕реЗ рд╣реИ?

рдпрд╛ рдореИрдВ рдЙрд╕ рд╕рдВрднреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛

@BridgeAR рдзрдиреНрдпрд╡рд╛рджред рдареАрдХ рд╣реИ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде "рд╡реА 3 рдХреЗ рд▓рд┐рдП рд╕рдбрд╝рдХ" рд░реЛрдбрдореИрдк рд╣реИ рдЬреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣рдЯрд╛рдПрдВ/рдмрд╣рд┐рд╖реНрдХрд░рдг рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рд╣рдЯрд╛рдПрдВ, рдЖрджрд┐, рд╡рд┐рдЪрд╛рд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдЕрддрд┐рд░рд┐рдХреНрдд рд░реЗрдбрд┐рд╕ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдЬреИрд╕реЗ рдмрдбрд╝реЗ рдХрд╛рдо рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдзрд╛рд░рдг рдШрд░ рдХреА рд╕рдлрд╛рдИ рдХреА рдЪреАрдЬреЗрдВ рдЬреЛ рдореИрдВ рд╢рд╛рдпрдж рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдЕрдЧрд░ рд╡реЗ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рдереЗ рддреЛ рдПрдХ рдмрд╛рд░ рд╡реА 3 рдлреАрдЪрд░ рд╢рд╛рдЦрд╛ рдЙрдкрд▓рдмреНрдз рдереАред

@ рд╡рд┐рдЧреНрд▓реБрдЪреА рдореИрдВрдиреЗ рдПрдХ рд╕рд╣рдпреЛрдЧреА рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ред рдореИрдВ рдЬрд▓реНрдж рд╣реА рдПрдХ рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ

+1 рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдПред

рдореИрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЬрдмрдХрд┐ рдореЗрд░рд╛ retry_strategy рдЕрднреА рднреА рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдгрд╛рдВрдХ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ, рдХрдорд╛рдВрдб (рдФрд░ рд╡реЗрдм рдЕрдиреБрд░реЛрдз) рдХреБрдЫ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдвреЗрд░/рдмреИрдХ-рдЕрдк рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ рдЙрдирдХреЗ рдЬреАрд╡рди рдХреЗ рд╕рд╛рде ... рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд░рдгрдиреАрддрд┐ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдХрд╣рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди _ рдЕрдВрддрддрдГ_ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? @Janpot рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреБрдЫ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ?

рд╢рд╛рдпрдж enable_offline_queue рдФрд░/рдпрд╛ retry_unfulfilled_commands рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдЖрдкрдХреА рдХрдбрд╝реА рдореЗрд╣рдирдд рдФрд░ рдорджрдж рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣рд╛рдВ рддреНрд╡рд░рд┐рдд рдЕрдкрдбреЗрдЯред
рдореИрдВрдиреЗ рдЕрдкрдиреЗ enable_offline_queue = false рдХреЛ рдЕрдкрдиреЗ createClient рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд╣реА рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬреЛ рд╣реИ:
" retry_strategy рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЗрд░реЗ рд░реЗрдбрд┐рд╕ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдЬрд╛рд░реА рд░рдЦреЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмреАрдЪ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рддреБрд░рдВрдд рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХ рджреЗрдВред рдлрд┐рд░, рдпрджрд┐ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рдмрд╕ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ ".

FYI рдХрд░реЗрдВ: get рдХреЙрд▓ рдкрд░ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдХреЛ рджреВрд░ рдХрд░рддрд╛ рд╣реИ: AbortError: SET can't be processed. Stream not writeable.

рдбреАрдмреА рдФрд░ рдореЗрд░реЗ рдРрдк рдХреЗ рдмреАрдЪ рд╕реАрдзреА рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЕрдзрд┐рдХ "рдордЬрдмреВрдд" рд╕рдорд╛рдзрд╛рди рд╕рдВрднрд╡ рд╣реИ рдЬрд╣рд╛рдВ:

  • рдХреНрд▓рд╛рдЗрдВрдЯ retry_strategy рдЖрдзрд╛рд░ рдкрд░ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ
  • рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХреЙрд▓/рдЙрдкрднреЛрдХреНрддрд╛/рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рд╣реИрдВрдЧ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ
  • рдХрдорд╛рдВрдб рдХреЛ рдЕрднреА рднреА рдХрддрд╛рд░рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕рд╢рд░реНрдд?)

рд╢рд╛рдпрдж рдпрд╣рд╛рдБ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрдард┐рди рдкрд░рд┐рджреГрд╢реНрдп рд╣реИрдВ ...

@рдиреНрдпреВрд╣рд╛рдЙрд╕ ,

рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд╣рддреЗ рдереЗ рдФрд░ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рдХреЙрд▓рд░ рдХреЛ рддреБрд░рдВрдд рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред

рдзрдиреНрдпрд╡рд╛рдж @newhouse , рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрднреА рдкрд╛рдпрд╛ рд╣реЛрдЧрд╛ред

рдЖрдИрдПрдордУ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХрдо рд╕реЗ рдХрдо retry_strategy рдЖрд╕рдкрд╛рд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЙрдЪрд┐рдд рд╣реИ, рдФрд░ рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдЦреЛрд▓реВрдВрдЧрд╛ред

@bwhitty рдХрд┐рд╕реА рд╕реЗ рднреА рдПрдХ рдбреЙрдХреНрд╕ рдкреАрдЖрд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

enable_offline_queue = false рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреЛрдЪрд╛ рдпрд╣ рд╣реИ рдХрд┐ createClient рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж рднреЗрдЬреЗ рдЧрдП рдЖрджреЗрд╢, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓реЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

enable_offline_queue = false рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреЛрдЪрд╛ рдпрд╣ рд╣реИ рдХрд┐ createClient рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж рднреЗрдЬреЗ рдЧрдП рдЖрджреЗрд╢, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓реЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

@jkirkwood рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдк ready рдИрд╡реЗрдВрдЯ (рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреА рдЙрдкрдпреБрдХреНрдд рдШрдЯрдирд╛) рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрдиреЗ рддрдХ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдЖрджреЗрд╢ рднреЗрдЬрдиреЗ рдореЗрдВ рджреЗрд░реА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

adamgajzlerowicz picture adamgajzlerowicz  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

strumwolf picture strumwolf  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gpascale picture gpascale  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

id0Sch picture id0Sch  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jackycchen picture jackycchen  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ