【问题标题】:What is the best approach to write retry logic for a node microservice?为节点微服务编写重试逻辑的最佳方法是什么?
【发布时间】:2018-03-06 06:00:19
【问题描述】:

如果我的Redis pubsub 失败,我想写一些登录信息。我想完成以下任务:

  1. 记录错误
  2. 最多重试 3 次
  3. 如果在 3 次尝试后发送失败
    • 记录错误
    • 回复错误信息(serviceUnavailable)

这是我的代码:

'use strict';

const Boom = require('boom');
const resolver = require('debug-resolve')(__filename, process.cwd());
const Debug = require('debug')(resolver);
const {
    auto,
    map,
    mapSeries
} = require('async');

const emitEvent = ({
    eventName,
    log,
    payload,
    pubSub,
    sqs,
    cb

}) => {

    auto({
        redisEventEmitter (autoCb) {

            try {

                Debug('Trying to emit new event received: %s', eventName);
                payload.eventName = eventName;
                pubSub.emit(`event-system:${eventName}`, payload);

                // @TODO: Add retry logic
                autoCb();

            } catch (error) {

                Debug(
                    'There was an error emitting new event (%s): %s',
                    eventName,
                    JSON.stringify(error)
                );
                Debug('Error %s', error);
                log(
                    ['RedisPubSub', 'error'],
                    `There was an error emitting new event (${eventName}): ${error.message}`
                );

                // @TODO: Add retry logic
                autoCb();

            }

        },
        eventSqs (autoCb) {

            try {

                Debug('Trying to publish new event received: %s', eventName);
                payload.eventName = eventName;
                sqs.publish({
                    messages: {
                        body: JSON.stringify(payload)
                    },
                    cb: autoCb
                });

            } catch (error) {

                Debug(
                    'There was an error publish new event (%s): %s',
                    eventName,
                    JSON.stringify(error)
                );
                Debug('Error %s', error);
                log(
                    ['EventSQS', 'error'],
                    `There was an error publish new event (${eventName}): ${error.message}`
                );

                // @TODO: Add retry logic
                autoCb();

            }

        }
    }, (err) => {

        if (err) {

            Debug('Error sending event %s', JSON.stringify(err));
            Debug('Error %s', err);
            return cb(
                Boom.badImplementation(err.message, {
                    status: 'failed',
                    code: err.code,
                    message: err.message,
                    ts: Date.now()
                })
            );

        } else {

            Debug('Submission successful');
            return cb(null, {
                eventName,
                status: 'submitted',
                ts: Date.now()
            });

        }

    });

};

这个逻辑在 Node JS v8 上运行。如果我能让RedisAWS-SQS 工作的逻辑,那就太好了。

【问题讨论】:

    标签: javascript node.js publish-subscribe


    【解决方案1】:

    您可以寻找以下代码示例

    var retryCount = 0;
    var errorMessage = []
    redisEventEmitter(autoCb) {
    
        if (retryCount => 3)
            return errorMessage
        else {
            try {
                payload.eventName = eventName;
                pubSub.emit(`event-system:${eventName}`, payload);
                // @TODO: Add retry logic
                autoCb();
            } catch (error) {
                retryCount ++;
                log(
                    ['RedisPubSub', 'error'],
                    `There was an error emitting new event (${eventName}): ${error.message}`
                );
                errorMessage = ['RedisPubSub', 'error']
                redisEventEmitter(autoCb)
                autoCb();
            }
        }
    
    }
    

    【讨论】:

    • 我包含了整个代码,因为我无法使用您的示例。
    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2010-12-06
    相关资源
    最近更新 更多