javascript - 为 Node 微服务编写重试逻辑的最佳方法是什么?

标签 javascript node.js publish-subscribe

如果我的 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 上运行。如果我能让逻辑适用于 Redis 和 AWS-SQS,那就太好了。

最佳答案

您可能正在寻找以下代码示例

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

}

关于javascript - 为 Node 微服务编写重试逻辑的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49124304/

相关文章:

javascript - Haxe JavaScript : get and set property by its name without using Reflect

javascript - 如何处理使用 promise 递归读取目录树

node.js - LIKE语句中查询参数导致响应慢

javascript - 在 Backbone 中,我可以将模型行为添加到集合中吗?

Redis 发布/订阅 : see what channels are currently subscribed to

javascript - addEventListener 检测变化类型

javascript - 如何在javascript中打开没有地址栏,书签栏等任何栏的浏览器窗口?

node.js - mkdir -p 在 Windows 上的 package.json 脚本中不起作用

node.js - 删除 nodejs devDependencies

macos - 使用 PubSub 获取 Gmail 未读邮件计数