Обработка тайм-аутов веб-сервиса при выполнении продолжительных задач базы данных

Вы можете сохранить следующее ожидаемое значение в замыкании и уменьшить массив.

function getRanges(array) {
    return array.reduce((l => (r, v, i, a) => {
        if (l[1] > v) return r;
        r.push(l[1] === v
            ? (r.pop(), l.join('-'))
            : (l = [v, v]).slice(0, 1).toString()
        );
        l[1]++;
        return r;
    })([]), []);
}

console.log(getRanges([-3, -2, -1, 2]));
console.log(getRanges([1, 2, 3, 4, 7, 8, 12, 15, 21, 21, 22, 23]));

13
задан Paul Williams 20 June 2019 в 18:38
поделиться

3 ответа

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

Например, мы разбили несколько огромных процессов на ряд шагов, таких как "Начать", "Обработать 1 часть работы", "Завершить" и "Собрать данные отчета". Шаги Process Work могут выполняться параллельно, но они не могут начаться, пока не завершится шаг Start. Шаг Finish должен дождаться завершения всех шагов Process Work.

Поскольку клиент управляет процессом, он может сообщать о ходе выполнения именно того шага, на котором он находится.

2
ответ дан 2 December 2019 в 00:47
поделиться

Я встретился с подобными проблемами в прошлом и использовал один из следующих 3 методов для разрешения его:

  1. Добавьте все длительные запросы к очереди и обработайте их последовательно.
    В моем случае они были все сложными отчеты, которые, где затем послано по электронной почте клиенту, или которые были сохранены в постоянных 'временных' таблицах для просмотра клиентами после того, как они были уведомлены.
  2. Мы назвали веб-сервис с помощью вызова JQuery, который затем названный методом обратной передачи JavaScript, когда это было завершено.
    Это работало хорошо, когда мы не хотели заставлять загрузку страницы синхронизироваться с тем, что делал веб-сервис.
    Однако это действительно означало, что та часть функциональности не была доступна, пока длительный процесс не был завершен.
  3. Самый сложный.
    Мы открылись другое окно, которое отобразило индикатор выполнения, который также периодически опрашивал сервер.
    Это использовало переменную сеанса, чтобы определить как далеко вперед показать индикатор выполнения.
    После того, как индикатор выполнения инициировался, новая дискуссия была начата, который периодически обновлял ту же переменную сеанса.
    После того как значение переменной сеанса было установлено к 100, всплывающее окно закрыло себя.
    Клиенты любили этот метод.

Так или иначе я надеюсь, что один из тех имеет некоторую справку к Вам.

6
ответ дан 2 December 2019 в 00:47
поделиться

Веб-сервис мог выполнить запросы в пуле потоков и если поток не заканчивается в, говорит 5 секунд (см. Поток. Соединение ()), вызов веб-сервиса возвращает клиент JobID вместо набора результатов, который клиент может затем использовать для опроса сервера каждые несколько секунд, чтобы видеть если его законченный запрос. Когда поток заканчивается, результаты могут быть сохранены в хеш-таблице до клиентских опросов снова.

5
ответ дан 2 December 2019 в 00:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: