我们需要有关使用Java NIO的服务器软件实现的建议

时间:2011-06-03 07:52:36

标签: java sql multithreading nio

我正在尝试计算我必须构建的服务器上的负载。

我需要创建一个服务器,在SQL数据库中注册了一百万用户。在一周内,每个用户将大约连接3-4次。每次用户启动并下载1-30 MB数据时,可能需要1-2分钟。

上传完成后,将在几分钟内删除。 (在计算中更新文本删除错误)

我知道如何制作和查询SQL数据库,但在这种情况下需要考虑什么?

4 个答案:

答案 0 :(得分:5)

你想要的是Netty。它是用NIO编写的API,提供了另一个事件驱动模型,而不是经典的线程模型。 它不会为每个请求使用一个线程,但它会将请求放入队列中。使用此工具,您每秒最多可以处理250,000个请求。

答案 1 :(得分:4)

我正在使用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();
    }
}

答案 2 :(得分:4)

  

起初我想的很多   用户需要非阻止   解决方案,但我的计算显示   我不,[我是]对吗?

在现代操作系统和硬件上,thread-per-connection is faster than non-blocking I / O,至少除非连接数达到极端水平。但是,为了将数据写入磁盘,NIO(通道和缓冲区)可能会有所帮助,因为它可以使用DMA并避免复制操作。

但总的来说,我还认为网络带宽和存储是您在此应用程序中的主要关注点。

答案 3 :(得分:3)

要记住的重要一点是,大多数用户在一周中的每一天的每个小时都不能均匀地访问系统。您的系统需要在一周中最繁忙的时段正确执行。

说出一周中最忙碌的一小时,所有上传的内容都是1/50。在最繁忙的时段,每个上传可能是30 MB,总共1.8 TB。这意味着您需要具有Internet上载带宽才能支持此功能。 1.8 TB /小时* 8位/字节/ 60分钟/小时/ 60秒/分钟= 4 Gbit / s互联网连接。

例如,如果您只有1 Gbit / s连接,这将限制对服务器的访问。

要考虑的另一件事是这些上传的保留时间。如果每次上传平均为15 MB,那么每周将获得157 TB或每年8.2 PB(8200 TB)。您可能需要大量存储才能保留此内容。

一旦您在互联网连接和磁盘上花费了大量资金,购买几台服务器的成本就会很低。您可以使用Apache MIMA,但是具有10 Gbit / s连接的单个服务器可以使用您选择的任何软件轻松支持1 GB。

单个PC /服务器/ labtop可以处理1,000个I / O线程,因此300-600不是很多。

问题不在于软件,而是在您选择的网络/硬件中。