413 Объект запроса слишком велик для 5,4 МБ JSON: как я могу увеличить параметр?

Мы отправляем данные в двоичном коде в качестве полезной нагрузки запроса JSON на наш сервер Netty. На меньших полезных нагрузках (1-2 МБ) все в порядке, но на больших полезных нагрузках происходит сбой с ошибкой HTTP 413 Request entity too large.

Мы нашли два места, где это может быть затронуто:

  1. конструктор для HttpObjectAggregator
  2. конструктор для JsonObjectDecoder парсер тела.

Мы установили первое значение по умолчанию выше (10 МБ) нашего порога проблемы (5 МБ), а второе мы вообще не используем, поэтому мы не знаем, как в этом разобраться.

(Кстати, мы намерены не использовать JSON для больших двоичных полезных нагрузок в будущем, поэтому «полезные» советы по изменению базовой архитектуры не требуются ;-))

Настройка конвейера У нас есть два этапа инициализации конвейера, где первый этап зависит от комбинации версии протокола http и SSL, а последний этап связан только с обработчиками уровня приложения. PipelineInitializer — это просто внутренний интерфейс.

/**
 * This class is concerned with setting up the handlers for the protocol level of the pipeline
 * Only use it for the cases where you know the passed in traffic will be HTTP 1.1
 */
public class Http1_1PipelineInitializer implements PipelineInitializer {

    private final static int MAX_CONTENT_LENGTH = 10 * 1024 * 1024; // 10MB

    @Override
    public void addHandlersToPipeline(ChannelPipeline pipeline) {
        pipeline.addLast(
                new HttpServerCodec(),
                new HttpObjectAggregator(MAX_CONTENT_LENGTH),
                new HttpChunkContentCompressor(),
                new ChunkedWriteHandler()
        );
    }

}

Настройка конвейера уровня приложения в нашем ApplicationPipelineInitializer. Я не думаю, что это так важно, но включено для полноты картины. Все обработчики в этой части являются обработчиками, определяемыми пользователем:

@Override
public void addHandlersToPipeline(final ChannelPipeline pipeline) {
    pipeline.addLast(
            new HttpLoggerHandler(),
            userRoleProvisioningHandler,
            authHandlerFactory.get(),
            new AuthenticatedUserHandler(services),
            createRoleHandlerFactory(configuration, services, externalAuthorizer).get(),
            buildInfoHandler,
            eventStreamEncoder,
            eventStreamDecoder,
            eventStreamHandler,
            methodEncoder,
            methodDecoder,
            methodHandler,
            fileServer,
            notFoundHandler,
            createInterruptOnErrorHandler());

    // Prepend the error handler to every entry in the pipeline. The intention behind this is to have a catch-all
    // outbound error handler and thereby avoiding the need to attach a listener to every ctx.write(...).
    final OutboundErrorHandler outboundErrorHandler = new OutboundErrorHandler();
    for (Map.Entry<String, ChannelHandler> entry : pipeline) {
        pipeline.addBefore(entry.getKey(), entry.getKey() + "#OutboundErrorHandler", outboundErrorHandler);
    }
}

Netty версии 4.1.15


person oligofren    schedule 04.09.2018    source источник
comment
Можете ли вы включить код, в котором вы запускаете обработчики?   -  person Norman Maurer    schedule 04.09.2018
comment
Да, это сделано.   -  person oligofren    schedule 04.09.2018
comment
Несколько смущает: это был вовсе не Netty, а экземпляр Nginx впереди, который вернул HTTP 413. Все, что мне было нужно, это изменить там директиву. .   -  person oligofren    schedule 04.09.2018
comment
не беспокойтесь... Спасибо за обновление :)   -  person Norman Maurer    schedule 05.09.2018


Ответы (1)


Извините, что отнял у всех время: это была вовсе не Нетти, отсюда и погоня за гусями. Изучив вывод, я обнаружил, что обратный прокси-сервер Nginx передал ошибку HTTP, а не Netty. Добавление client_max_body_size 10M; сделало свое дело, выровняв его ограничения с ограничениями Netty.

person oligofren    schedule 04.09.2018
comment
мой коммент только что выложил, тоже допросил клиент (который прокси тоже есть). - person Martin Zeitler; 04.09.2018