Java生产者消费者股票交易所低水平

时间:2015-10-14 15:04:34

标签: java sockets asynchronous nonblocking task-queue

我需要在Java中编写一个用于证券交易所的服务器,服务器每秒会从几台服务器获得很多请求,我的目标是编写这个服务器并找出它执行几次后可以处理的HTTP GET请求数量。条件并在不到100毫秒内发送响应。

每个请求都包含一个有效期为100毫秒的令牌。

我的目标是使用请求参数从缓存(Redis / Memcached)获取数据,执行几个O(1)条件,使用令牌向同一服务器发送响应,并在最长100毫秒内发送布尔答案并保存数据库中的请求和响应(异步)。

此服务器将位于AWS ec2上与请求服务器位于同一区域。

它需要用Java编写,应该是低级别,顺便说一句,我来自Python / NodeJS世界过去两年。

我认为它是一种经典的生产者 - 消费者设计模式。

任何人都可以指导我使用技术部件吗?比如...使用“this”来处理请求(SocketInputStream),并使用“that”来处理队列,或者使用“OpenMQ”框架?用“this”监视请求?对于类似问题的实现的任何参考?

更新1: 谢谢@ mp911de,我看到了LMAX(Disruptor),有人已经发明了这个轮子,但感觉就像过度编程一样,我想检查可以发送多少个1k json对象并从运行这个的简单ec2-server回复100bytes我附加的java代码?顺便说一下,Executors.newFixedThreadPool中放了多少个线程?

public class JavaSimpleWebServer {
private static final int fNumberOfThreads = 100;
private static final Executor fThreadPool = Executors.newFixedThreadPool(fNumberOfThreads);
public static final int PORT = 81;

public static void main(String[] args) throws IOException {

    ServerSocket socket = new ServerSocket(PORT);
    while (true)
    {
        final Socket connection = socket.accept();
        Runnable task = new Runnable() {
            @Override
            public void run() {
                HandleRequest(connection);
            }
        };
        fThreadPool.execute(task);
    }
}

private static void HandleRequest(Socket s) {
    BufferedReader in;
    PrintWriter out;
    String request;
    try {
        String webServerAddress = s.getInetAddress().toString();
        System.out.println("New Connection:" + webServerAddress);
        in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        request = in.readLine();
        System.out.println("--- Client request: " + request);
        out = new PrintWriter(s.getOutputStream(), true);
        // do some calculation
        out.println(jsonResponse);
        out.flush();
        out.close();
        s.close();
    }
    catch (IOException e)  {
        System.out.println("Failed respond to client request: " + e.getMessage());
    }
    finally  {
        if (s != null)
        {
            try {
                s.close();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

}

0 个答案:

没有答案