Nano Hash - криптовалюты, майнинг, программирование

Почему nginx-jwt так медленно проверяет токен?

Я пишу приложение Spring, которое выполняет очень простую задачу.

Я хочу сравнить время проверки токена с использованием nginx-jwt (Lua) и проверки с использованием чистой Java (jose4j). Выполнение POST-запроса к конечной точке с заголовком аутентификации, конечная точка / — это место, где я использую nginx-jwt для проверки, а /token-java — это конечная точка, использующая Java.

nginx-jwt — это инструмент, использующий скрипт Lua для проверки токенов, а также я пишу программу для проверка времени тестирования с использованием java и nginx-jwt.

public class ComparePerformance {
     private static final String NGINX_VALIDATE_URL = "http://localhost/";
     private static final String JAVA_VALIDATE_URL = "http://localhost/token-java";
     private RestTemplate restTemplate;

    public ComparePerformance() {
        restTemplate = new RestTemplate();
    }

    public long getTimeValidateNginx() {
        return getTimeValidate(NGINX_VALIDATE_URL);
    }

    public long getTimeValidateJava() {
        return getTimeValidate(JAVA_VALIDATE_URL);
    }

    private long getTimeValidate(String url) {
        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", getToken());
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
        long startTime = System.nanoTime();
        for (int i = 0; i < 10; i++) {
            restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
        }
        long endTime = System.nanoTime();
        return endTime - startTime;
    }

    private String getToken() {
        return "Bearer xxxx";
    }

    public static void main(String[] args) {
        ComparePerformance cp = new ComparePerformance();
        long timeNginx = cp.getTimeValidateNginx() / 1_000_000;
        long timeJava = cp.getTimeValidateJava() / 1_000_000;

        LogUtil.log(Level.INFO, cp.getClass(),
            "%nNginx validate time: %dms%n" +
                    "Java validate time: %dms", timeNginx, timeJava);
}

}

Вот моя конфигурация в Nginx: (nginx.conf)

location / {
    access_by_lua '
        local jwt = require("nginx-jwt")
        jwt.auth()
    ';
    proxy_pass http://localhost; 
}

location /token-java {
    proxy_pass http://localhost/token-java
}

Вот моя проверка Java, я использую jose4j для проверки с использованием алгоритма hs256 - так же, как nginx-jwt, ниже приведен метод проверки и анализа токена:

public Map<String, Object> parseToken(String JWTToken) throws InvalidJwtException {

    Key verificationKey = new HmacKey(secretKey.getBytes());
    JwtConsumer secondPassJwtConsumer = new JwtConsumerBuilder()
            .setExpectedIssuer(officialIssuer)
            .setSkipDefaultAudienceValidation()
            .setVerificationKey(verificationKey)
            .setRequireExpirationTime()
            .setAllowedClockSkewInSeconds(30)
            .setRequireSubject()
            .build();
    JwtClaims jwtClaims = secondPassJwtConsumer.processToClaims(JWTToken);

    return jwtClaims.getClaimsMap();
}

И вот результат:

Nginx validate time: 9037ms
Java validate time: 57ms

Как видите, Nginx намного медленнее, чем Java.

Кто-нибудь может это объяснить? Я очень смущен, потому что вижу некоторые фотографии, на которых Lua работает быстрее, чем Java.

18.01.2017

Ответы:


1

Извините, что задаю этот вопрос. Я понимаю, почему мой токен проверки nginx-jwt такой медленный. Ну просто потому, что я использовал лимитный запрос в конечной точке "/". При снятии этого ограничения проверка в nginx выполняется не так медленно, как проверка в приложении Java.

18.01.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..