为节点微服务编写重试逻辑的最佳方法是什么?

问题描述 投票:0回答:1

如果我的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个回答
2
投票

您可以查找以下代码示例

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();
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.