Отдых: как обработать тысячи одинаковых запросов - PullRequest
0 голосов
/ 07 января 2019

У меня есть веб-сервис rest, который в основном занимает много времени и определяет, является ли число простым или нет, то есть обычный / текстовый true или false.

миллионы пользователей используют этот сервис.

Теперь один пользователь отправляет очень большое число, например (15-20-значное число / большое число), и моя служба тратит время, чтобы вычислить, является ли число простым или нет. Этот пользователь непрерывно отправляет тысячи запросов на один и тот же номер. Итак, как обрабатывать эти самые тысячи запросов.

Например:

Отправка номера 101221323232324343 в запросе, и моя служба занимает, скажем, 3 секунды, чтобы выяснить, простое число или нет. Теперь он отправляет 1000 запросов в секунду.

как справиться с этим делом?

Ответы [ 3 ]

0 голосов
/ 07 января 2019
@NotThreadSafe 
public CheckIfPrime extends Servelet  {
    private Long lastNumber;
    private Long isLastNumberPrime;

    public Long operation(ServeletRequest req, ServeletResponse res) {
        if(getNumberFromRequest(req) == lastNumber) {
            return isLastNumberPrime;
        } else {
             return checkForPrimeNumber(getNumberFromRequest);
        }
    }

}

Использование примитивов синхронизации для соблюдения инвариантов и постусловий класса (можно использовать AtomicLong вместо Long)

Если вы считаете, что количество запросов может быть слишком большим (истощение памяти), рассмотрите возможность использования распределенного кэша.

Для очень высокого TPS, сделайте ваше приложение реактивным. Операция checkForPrime() может выполняться асинхронно. Зачем блокировать вызывающий поток?

0 голосов
/ 07 января 2019

Вы можете использовать высвобождающий кэш в памяти, настраивая его параметры в соответствии с максимальным объемом памяти или TTL. Для общей информации проверьте, например, Изгнание LFU-кэша . Существует много реализаций, хотя я бы порекомендовал библиотеку кофеина от Ben Manes для ее эффективности. Вы можете использовать БД, но в этом случае ввод-вывод может оказаться более дорогим, чем новые вычисления, поэтому я бы, вероятно, ограничил кэширование только памятью.

0 голосов
/ 07 января 2019

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

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