Проблемы с размером сообщения RabbitMQ
Мы использовали RabbitMQ в качестве брокера. Он находится между нашим клиентом, написанным на Go с NGINX, и сервером API. Мы успешно использовали его до сих пор. Размер используемого нами сообщения увеличился до ~20 МБ. Отправка этого большого сообщения последовательно вызывает следующую ошибку:
= ОТЧЕТ ОБ ОШИБКАХ ==== 20 октября 2018 года::11:17:59 === Ошибка в процессе <0.21106.0> на узле 'rabbit@pc11213' со значением выхода: {[{reason,{badmatch,{ больше,<<8001224 байта >>,{http_req,#Port<0.99287>,ranch_tcp,keepalive,<0.21106.0>,<<4 байта >>,'HTTP/1.1',{{127,0,0,1},58904},<<9 байт >>, не определено,15672,<<39 байт >>, не определено, << 0 байт >>,[],[{exchange,<<12 байт >>},{vhost,<<3 байта >>}],[{<<4 байта >>,<<15 байтов >>},{<<10 байтов >>,<<18 байтов >>},{<<14 байтов >>,<<8 байт >>},{<<13 байт >>,<<26 байт >>},{<<12 байт >>,<<16 байт >>},{<<15 байт >>,<<4 байта >>}],[{<<14 байтов >>,20432940},{<<17 байтов >>,[<<8 байтов >>]},{<<6 байтов >>, не определено}, {< <12 байтов >>, {<< 11 байтов >>,<<4 байта >>,[]}},{<<17 байтов >>, не определено}, {<< 13 байт >>, не определено},{<<19 байт >>, не определено...
- наблюдение за сетевым трафиком с помощью wireshark показывает, что сервер отправляет ответ 500 в середине потока передачи TCP, отправленного клиентом, что указывает на то, что сервер не может справиться с поступающими данными.
Мы используем конечную точку управления HTTP и плагины:
=INFO REPORT==== 19-Oct-2018::14:28:44 === Server startup complete; 6 plugins started.
* rabbitmq_management
* rabbitmq_web_dispatch
* rabbitmq_management_agent
* cowboy
* cowlib
* amqp_client
Мы попытались изменить конфигурацию сервера rabbitMQ/ cowboy, но безрезультатно.
[{rabbitmq_management,
[{listener, [{port, 15672},
{cowboy_opts, [{ max_request_line_length, 16000 },{max_keepalive, 1000}]}
]}
]
}].
- значение по умолчанию max_request_line_length было 8000 -> увеличено до 160000, как я могу быть уверен, что эти параметры действительно применяются?
- также изменение req.Header.Set("Content-Type", "multipart/form-data") не помогло в переходе клиента
Поэтому мы считаем, что нам нужно либо отойти от rabbitMQ, либо использовать какой-то другой протокол с другим плагином.
Мы считаем, что rabbitMQ не должен ограничиваться размером сообщения. Мы не будем ссылаться на полезную нагрузку в сообщении. Любые предложения о том, как мы можем увеличить допустимый размер сообщения?
Изменить: Мы попробовали дальнейшие изменения в настройках ковбоя:
{rabbitmq_management,
[{cors_allow_origins,[]},
{cors_max_age,1800},
{http_log_dir,none},
{listener,
[{port,15672},
{cowboy_opts,
[{compress,true},
{max_request_line_length,160000},
{max_keepalive,1000},
{idle_timeout,120000},
{inactivity_timeout,120000},
{request_timeout,120000}]}]},
{load_definitions,none},
{management_db_cache_multiplier,5},
{process_stats_gc_timeout,300000},
{stats_event_max_backlog,250}]},
Который выдал ту же ошибку:
2018/10/24 16:31:06 Размер файла списка:20431558 2018/10/24 16:31:06 Извлеченный pid:20.# 2018/10/24 16:31:07 Сообщение http: // производное:#@localhost:#/api/exchanges/%2F/ производная-exchange / publish: net / http: HTTP / 1.x транспортное соединение разорвано: запись tcp 127.#->127.#: write: сброс соединения по одноранговому узлу
1 ответ
Похоже, ошибка вводит в заблуждение. в идеале rabbitmq не должен ограничивать размер сообщения. Но HTTP API может иметь ограничения.
RabbitMQ (фактически любое решение для очередей) не идеально подходит для обмена сообщениями большого размера. Вместо этого сохраните сообщение большого размера в хранилище объектов (AWS s3) и опубликуйте метаданные хранимых объектов в очереди.
Другие опции...
- Попробуйте использовать AMQP для обмена сообщениями большого размера с RabbitMQ.
Попробуйте увеличить cowboy_opts -> request_timeout (миллисекунды).
{cowboy_opts, [{compress, true}, %% 120 seconds {idle_timeout, 120000}, {inactivity_timeout,120000}, {request_timeout, 120000}]} ]}