Функции Azure - обработка ошибок при записи в привязки вывода таблицы - PullRequest
2 голосов
/ 08 апреля 2019

У меня есть настройка функции Azure, которая.Его триггер настроен на сообщение Service Bus Queue .Когда функция запускается, сообщение обрабатывается каким-либо образом.Если во время обработки возникает какое-либо исключение, я обрабатываю эту ошибку и сохраняю сообщение в хранилище таблиц Azure, установленное в качестве выходной привязки для целей ведения журнала.

Я хочу обрабатывать любые ошибки, возникающие при записи чего-либо в выходную привязку.Как бы я поступил так?

Сведения об ошибке

Одна из ошибок, с которыми я столкнулся во время записи в привязку вывода (хранение таблицы), заключается в том, что значение некоторого ключа не может быть сохранено.Например, один из ключей в сообщении - time со значением типа число .При записи этих данных я получил исключение, что значение ключа не может вписаться в число Int32.Я думаю, что хранилище таблиц попыталось преобразовать число в Int32 по умолчанию, но не удалось.Чтобы обойти это, я преобразовал все ключи в строковые значения.Теперь я могу сохранить.

Но все же я хочу обрабатывать любые непредвиденные ошибки при записи в привязку вывода таблицы хранения.

Важна обработка ошибокв этом случае, поскольку если сообщение служебной шины не используется должным образом, то сообщение не удаляется в очереди служебной шины, и после завершения выполнения функции Azure это сообщение снова вызывает функцию, и функция входит в неопределенный цикл.

Ниже приведен пример функции Azure

module.exports = async function (context, mySbMsg) {
    try{
        // process service bus message
        await processMsg(mySbMsg);
    } catch(e) {
        // if processing fails, save the message in Azure table
        try{
            // my own try to handle errors, but was unsuccessful
            await new Promise(function (resolve, reject) {
                context.bindings.tableBinding = [];
                context.bindings.tableBinding.push({
                    PartitionKey: mySbMsg.id|| "unknown",
                    RowKey: time + "",
                    errorMessage: e.message || "",
                    ...mySbMsg
                })
                resolve();
            });
        } catch (e) {
            // do something HERE;
            // exception on output binding didn't brought me here
        }
    }
    context.done();
}

1 Ответ

2 голосов
/ 11 апреля 2019

Связывание ввода и вывода выполняется вне области действия функции, поэтому вы не можете вводить блоки перехвата внутри функции. Если вы хотите отловить ошибку, вы можете самостоятельно выполнить запись в хранилище вместо использования выходной привязки.

Однако ваша очередь служебной шины не будет запускать функцию в бесконечном цикле, если вам не удастся выполнить запись в хранилище. Служебная шина ограничивает число повторных попыток, и после достижения этого ограничения сообщение перемещается в отдельную очередь недоставленных сообщений, чтобы избежать бесконечных циклов. Сообщения там не имеют срока действия - они будут храниться там до тех пор, пока вы не будете готовы обработать или удалить их.

enter image description here

Максимальный счетчик доставки по умолчанию равен 10, и вы можете настроить его в колонке свойств очереди.

Что касается работы с сообщениями в очереди недоставленных писем, я обнаружил, что Service Bus Explorer очень полезен. Довольно просто взглянуть на сообщения в DLQ, а затем либо отправить их обратно в основную очередь, либо удалить их.

Вы также можете получать программный доступ к DLQ и создавать автоматизированные системы для обработки этих сообщений. Однако, поскольку оттуда некуда идти сообщениям, вы можете зацикливаться, если ваш обработчик DLQ не может разрешить сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...