Нам нужен совет для реализации серверного программного обеспечения с Java NIO - PullRequest
6 голосов
/ 03 июня 2011

Я пытаюсь вычислить нагрузку на сервер, который мне нужно построить.

Мне нужно создать сервер, на котором зарегистрирован миллион пользователей в базе данных SQL.В течение недели каждый пользователь будет подключаться примерно 3-4 раза.Каждый раз, когда пользователь загружает 1-30 МБ данных и загружает их, это может занять 1-2 минуты.

После завершения загрузки они будут удалены в течение нескольких минут.(Обновить текст убрал ошибку в вычислениях)

Я знаю, как создать и запросить базу данных SQL, но что нужно учитывать в этой ситуации?

Ответы [ 4 ]

5 голосов
/ 03 июня 2011

То, что вы хотите точно, это Нетти . Это API, написанный на NIO и обеспечивающий другую модель, управляемую событиями, вместо классической модели потоков. Он не использует поток для запроса, но помещает запросы в очередь. С помощью этого инструмента вы можете делать до 250 000 запросов в секунду.

4 голосов
/ 03 июня 2011

Сначала я так много думал пользователям потребуется неблокирование Решение, но мои расчеты показывают, что Я не прав, верно?

В современных операционных системах и аппаратном обеспечении поток-на-соединение быстрее, чем неблокирующая I / O, по крайней мере, если количество соединений не достигает действительно экстремальных уровней. Однако для записи данных на диск может помочь NIO (каналы и буферы), поскольку он может использовать DMA и избегать операций копирования.

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

4 голосов
/ 03 июня 2011

Я использую Netty для аналогичного сценария. Это просто работает!

Вот начальная точка для использования netty:

public class TCPListener {
    private static ServerBootstrap bootstrap;

    public static void run(){
        bootstrap = new ServerBootstrap(
                new NioServerSocketChannelFactory(
                        Executors.newCachedThreadPool(),
                        Executors.newCachedThreadPool()));

        bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
            public ChannelPipeline getPipeline() throws Exception {
                TCPListnerHandler handler = new MyHandler();
                ChannelPipeline pipeline = Channels.pipeline();
                pipeline.addLast("handler", handler);

                return pipeline;
            }
        });

        bootstrap.bind(new InetSocketAddress(9999));  //port number is 9999
    }

    public static void main(String[] args) throws Exception {
        run();
    }
}

и класс MyHandler:

public class MyHandler extends SimpleChannelUpstreamHandler {
    @Override
    public void messageReceived(
        ChannelHandlerContext ctx, MessageEvent e) {


        try {
            String remoteAddress = e.getRemoteAddress().toString();
            ChannelBuffer buffer= (ChannelBuffer) e.getMessage();
            //Now the buffer contains byte stream from client.

        } catch (UnsupportedEncodingException ex) {
            ex.printStackTrace();
        }

        byte[] output; //suppose output is a filled byte array
        ChannelBuffer writebuffer = ChannelBuffers.buffer(output.length);
        for (int i = 0; i < output.length; i++) {
            writebuffer.writeByte(output[i]);
        }


        e.getChannel().write(writebuffer);
    }

    @Override
    public void exceptionCaught(
            ChannelHandlerContext ctx, ExceptionEvent e) {
        // Close the connection when an exception is raised.
        e.getChannel().close();
    }
}
3 голосов
/ 03 июня 2011

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

Скажем, самый загруженный час недели, сделано 1/50 всех загрузок. В самый загруженный час каждая загрузка может быть 30 МБ, всего 1,8 ТБ. Это означает, что для этого требуется пропускная способность для загрузки через Интернет. 1,8 ТБ / час * 8 бит / байт / 60 мин / час / 60 сек / мин = 4 Гбит / с Интернет-соединение.

Если, например, у вас есть только 1 Гбит / с соединение, это ограничит доступ к вашему серверу.

Другая вещь, которую следует учитывать, - это время хранения этих загрузок. Если каждая загрузка в среднем составляет 15 МБ, вы будете получать 157 ТБ в неделю или 8,2 ПБ (8200 ТБ) в год. Вам может понадобиться значительный объем памяти, чтобы сохранить это.

После того, как вы потратите значительную сумму денег на подключение к Интернету и на диск, стоимость покупки пары серверов будет незначительной. Вы можете использовать Apache MIMA, однако один сервер с подключением 10 Гбит / с может легко поддерживать 1 ГБ, используя любое программное обеспечение, которое вы выберете.

Один ПК / сервер / labtop может обрабатывать 1000 потоков ввода-вывода, поэтому 300-600 - это немного.

Проблема не в программном обеспечении, а в выбранной вами сети / оборудовании.

...