Как масштабировать этот однопоточный Java-клиент? - PullRequest
1 голос
/ 21 января 2010

Я пишу клиент протокола Stomp с Java, и у него есть только один поток для обработки ввода-вывода.Это означает, что поток читает и записывает входящие данные в приложение и обратно.Моя проблема в том, что если мне нужно будет масштабировать это приложение в будущем с помощью многопоточности и NIO, как это можно организовать?

мой поток процессора ввода-вывода называется ссылкой TcpLink и имеет следующий скелетинг

    class TcpLink implements Runnable {

         public void run() {
            // read data from socket and assign it to  a byte buffer
            // notify the listening application
         }
   }

Если мне нужно разрешить нескольким потокам отправлять входящие сообщения, как этот класс следует изменить?

спасибо!

Ответы [ 2 ]

2 голосов
/ 21 января 2010

Мне очень нравится эта презентация Дуга Ли о разработке масштабируемых систем на основе Java NIO.

По сути, ваш дизайн обычно будет основан на шаблоне Reactor , в результате чего один поток ввода-вывода циклически перебирает множество клиентских соединений. Если поток ввода / вывода когда-либо станет насыщенным, вы можете рассмотреть вопрос об отключении соединений от главного реактора до одного или нескольких дочерних реакторов; каждый реактор содержит свой поток.

Еще один важный момент, который следует отметить в вашем проекте, заключается в том, что поток ввода-вывода должен выполнять только операции ввода-вывода и обычно должен отправлять любые входящие сообщения в отдельный поток (например, ExecutorService), чтобы фактическая работа. Это не позволяет другим соединениям испытывать недостаток ввода / вывода во время обработки данного сообщения.

1 голос
/ 21 января 2010

Лучше написать класс-обертку, который управляет списком классов TcpLink. Роль класса-обертки будет получать входящие сообщения и назначать его ожидающему / немногим экземпляру TcpLink, вы можете вычислить пропускную способность / TPS и создавать новые экземпляры, когда вам будет нужно. На данный момент вы создадите только один из них, так что это один сингл.

...