2016-12-29 10 views
1

У меня возникли проблемы с получением больших подпротокольных сообщений с использованием Spring Boot, Spring WebSocket и Undertow. Сообщения обрезаются после 16kB. После выполнения некоторого рытья я нашел следующую конфигурацию свойство, которое, кажется, делать то, что я хочу:Как получить сообщения WebSocket размером более 16 КБ с Spring WebSockets и Undertow

недвижимости
server.undertow.buffer-size=32768 

Этой конфигурация, кажется, правильно подобрала при проверке/configprops привода конечной точки. К сожалению, это не помогает при получении сообщений размером более 16 КБ.

Я также наткнулся на этих зловещих линиях от документации прибойной (курсив моего):

Для серверов идеального размера, как правило, 16k, так как это , как правило, максимальный объем данных, которые могут быть записаны через операцию write() (в зависимости от сетевой настройки операционной системы).

Это подтверждает то, что я испытывал, что настройка server.undertow.buffer-size не влияет, поскольку она ограничена установкой уровня ОС. Поскольку я использую Ubuntu Linux, я играл с настройками net.core.rmem_* и net.core.wmem_*, но они также не имеют никакого эффекта. Невозможно воспроизвести эту проблему на macOS.

Кто-нибудь знает, как настроить Undertow, Spring Boot и/или Spring WebSocket для поддержки этих сообщений?

ответ

0

Я непосредственно ответил на вопрос выше себя. Настройки, которые я предложил весной Boot do работа! Проблема была в том, что балансировка нагрузки, в нашем случае haproxy, перед ней была обрезанием сообщений после 16kB. Настройка haproxy для разрешения больших сообщений решила проблему. В то же время мы улучшили протокол, который мы использовали, чтобы быть более эффективным, поэтому мы больше не требуем этих больших сообщений, поэтому наше решение haproxy не было протестировано на производстве (YMMV).

Поскольку разработчики все работали над macOS и Windows, и проблема возникла только в среде принятия и производства, в которой запущен Ubuntu, мы неправильно предположили, что это было причиной.

уроки (это все на самом деле тупые и простые, но мы сделали эти ошибки так или иначе):

  • Обязательно проверять все ваши предположения! Если бы мы думали, что проблема Ubuntu, мы должны были выделить Ubuntu в тестах ранее. Например, используя виртуальную машину с Ubuntu, на которой можно проверить наши предположения в карантеине.
  • Убедитесь, что ваша среда разработки соответствует вашей производственной среде! В наших средах разработки мы не запускали haproxy. Как разработчики «высокого уровня» мы склонны откладывать балансировки нагрузки и веб-серверы в качестве товарной инфраструктуры, но этот пример еще раз показывает, что эти «товары» могут очень напрямую влиять на работу вашего приложения.