【发布时间】:2016-10-20 09:46:10
【问题描述】:
假设您需要编写一个 1000 rps 的服务器。将来负载可能会增加。服务器只提供一种请求 - getGender(name) 接受名称,并返回 Male/Female。确定性别是最简单的操作,需要单索引查找,其中索引是内存中的数据结构。
如果理解正确 - 您创建单个 ServerVerticle,然后运行 Runtime.getRuntime().availableProcessors() 工作节点,将作业委托给它(参见下面的代码)。
问题:
- 这是 1000 rps 任务的最佳方案吗?
-
当 15 个工作人员不足时,在请求高峰时会发生什么?假设一个工作人员可以处理 100 rps。你有 15 名工人。但是在高峰时间你有 3000 rps。
- 假设
NetServer可以处理 3000 rps,但工人坚持处理它们。 Vert.x 有任何队列来继续等待请求吗?怎么做?如果有 - 工人失败会发生什么? - 假设
NetServer无法处理 3000 rps - 只运行几个服务器实例。 没有陷阱,对吧?
- 假设
- TCP 是该任务的更好选择吗?
- Vert.x 是多反应器,它像 Node 一样运行它的事件循环。
ServerVerticle与事件循环在同一个线程中运行,对吧? - 如果你有 16 个核心,1 个核心专用于事件循环,那么 Vert.x 将运行 15 个 GenderVerticles,对吧? 没有更多的读取?
ServerVerticle.java
public class ServerVerticle extends AbstractVerticle {
public static void main(String[] args) {
Consumer<Vertx> runner = vertx -> vertx.deployVerticle("ServerVerticle", new DeploymentOptions());
Vertx vertx = Vertx.vertx();
runner.accept(vertx);
}
@Override
public void start() throws Exception {
NetServerOptions options = new NetServerOptions();
NetServer server = vertx.createNetServer(options);
server.connectHandler(socket -> {
socket.handler(buffer -> {
vertx.eventBus.send("get.gender", buffer, res -> socket.write(res.toString()));
});
});
server.listen(1234, "localhost");
//Deploy worker verticles
DeploymentOptions deploymentOptions = new DeploymentOptions()
.setInstances(Runtime.getRuntime().availableProcessors())
.setWorker(true);
vertx.deployVerticle("GenderServiceVerticle", deploymentOptions);
}
}
GenderVerticle.java
public class GenderVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
vertx.eventBus().consumer("get.gender", message -> {
String gender = singleIndexLookup(message);
message.reply(gender);
});
}
singleIndexLookup() { ... }
}
【问题讨论】:
标签: java vert.x reactor high-load