На сервере ChannelPipelineFactory # getPipeline() вызывается для каждого нового соединения. У моих каналов ChannelHandlers сервера есть выделение для буферов сериализации и других объектов, которые не являются потокобезопасными. Как я могу избежать выделения их для каждого соединения? Мое приложение имеет большой объем недолговечных соединений, и это ухудшает производительность. Я не сохраняю состояние подключения в обработчиках, мне действительно нужно их выделять один раз в потоке, который будет использовать конвейер, потому что объекты в обработчиках не являются потокобезопасными.с использованием трубопровода Netty эффективно
Возможно, я мог бы использовать конвейер с одним обработчиком. Когда какое-либо событие получено, я получаю ссылку на мой фактический обработчик из ThreadLocal. Таким образом, я только распределяю фактический обработчик один раз на потоки, обслуживающие соединения. Это означает, что ThreadLocal ищет все события.
Есть ли другие решения, которые могут быть лучше?
У меня создалось впечатление, что конвейер Netty отлично смотрится в относительно простом примере кода и довольно аккуратный, когда он подходит к проблеме (например, обработка HTTP), но что он не очень гибкий для многих других сценариев. Here - это что-то elses мысли по этим линиям. Это не какая-то катастрофа, поскольку использование одного обработчика для рулона вашего собственного «конвейера» кажется совершенно жизнеспособным, но мне интересно, не делаю ли я это неправильно?
Хм, хороший момент. AFAIK, пока это нормально, так как мой сервер открыт/запрос/ответ/закрыт, поэтому поток записи всегда будет рабочим потоком. Записи будут происходить либо сразу, либо в рабочем потоке, который читает ответ, либо если запись не удалась, а затем позже, используя OP_WRITE, также в рабочем потоке. Если мои запросы начнут длиться, и я представляю пул потоков, чтобы избежать блокировки рабочих потоков, мне пришлось бы изменить ThreadLocal на синхронизированный пул. Все это звучит правильно? – NateS
да звучит нормально для меня –