我需要在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();
}
}
}
}
}