2012-05-16 4 views
4

На сервере ChannelPipelineFactory # getPipeline() вызывается для каждого нового соединения. У моих каналов ChannelHandlers сервера есть выделение для буферов сериализации и других объектов, которые не являются потокобезопасными. Как я могу избежать выделения их для каждого соединения? Мое приложение имеет большой объем недолговечных соединений, и это ухудшает производительность. Я не сохраняю состояние подключения в обработчиках, мне действительно нужно их выделять один раз в потоке, который будет использовать конвейер, потому что объекты в обработчиках не являются потокобезопасными.с использованием трубопровода Netty эффективно

Возможно, я мог бы использовать конвейер с одним обработчиком. Когда какое-либо событие получено, я получаю ссылку на мой фактический обработчик из ThreadLocal. Таким образом, я только распределяю фактический обработчик один раз на потоки, обслуживающие соединения. Это означает, что ThreadLocal ищет все события.

Есть ли другие решения, которые могут быть лучше?

У меня создалось впечатление, что конвейер Netty отлично смотрится в относительно простом примере кода и довольно аккуратный, когда он подходит к проблеме (например, обработка HTTP), но что он не очень гибкий для многих других сценариев. Here - это что-то elses мысли по этим линиям. Это не какая-то катастрофа, поскольку использование одного обработчика для рулона вашего собственного «конвейера» кажется совершенно жизнеспособным, но мне интересно, не делаю ли я это неправильно?

ответ

3

Использование ThreadLocal кажется хорошей идеей, если этого достаточно для вас. Имейте в виду, что это будет хорошо работать только для восходящих событий, поскольку нисходящие события могут быть запущены любым потоком, поэтому материал ThreadLocal может не работать так хорошо.

+0

Хм, хороший момент. AFAIK, пока это нормально, так как мой сервер открыт/запрос/ответ/закрыт, поэтому поток записи всегда будет рабочим потоком. Записи будут происходить либо сразу, либо в рабочем потоке, который читает ответ, либо если запись не удалась, а затем позже, используя OP_WRITE, также в рабочем потоке. Если мои запросы начнут длиться, и я представляю пул потоков, чтобы избежать блокировки рабочих потоков, мне пришлось бы изменить ThreadLocal на синхронизированный пул. Все это звучит правильно? – NateS

+0

да звучит нормально для меня –

Смежные вопросы