Предположим, вам нужно написать сервер с 1000 рпс. Нагрузка может расти в будущем. Сервер обслуживает только один вид запроса - getGender(name)
, который принимает имя и возвращает Male
/Female
. Определение пола - это простейшая операция, которая требует поиска по одному индексу, где index - это структура данных в памяти.Vert.x: простой сервер с 1000 р.
Если вы правильно поняли - вы создаете одиночный ServerVerticle
и выполняете Runtime.getRuntime().availableProcessors()
рабочих вертикалей, на которые делегировать задание (см. Код ниже).
Вопросы:
- Это самая лучшая схема для задачи 1000 оборотов в секунду?
- Что произойдет по запросу, когда будет 15 рабочих? Предположим, что один рабочий может обрабатывать 100 rps. У вас 15 рабочих. Но в пиковое время у вас есть 3000 рпс.
- Предположим, что
NetServer
может обрабатывать 3000 об/мин, но рабочие застревают у них. У Vert.x есть какая-либо очередь для ожидания ожидающих запросов? Как это сделать? Если это так - что происходит на рабочем месте? - Предположим, что
NetServer
не может обрабатывать 3000 rps - просто запустите несколько экземпляров сервера. Нет подводных камней, не так ли?
- Предположим, что
- Является ли TCP лучшим выбором для задачи?
- Vert.x - многореактор, который, подобно узлу, запускает цикл событий.
ServerVerticle
запущен в той же теме, что и event-loop, правильно? - Если у вас есть 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() { ... }
}
благодарим вас за полное раскрытие! Но можете ли вы объяснить, как я могу извлечь выгоду из многопоточности/многоядерности, если бы у меня было только одно ServerVerticle/GenderVerticle на машину? Как Vert.x будет распараллеливать обработку запросов на одной машине, если она будет иметь только одну вершину? Извините, не нашли по ссылке http://vertx.io/docs/vertx-core/java/#_the_vert_x_launcher ответ, почему мне не нужен основной метод и совпадение процессора. Этот код 'Runtime.getRuntime(). AvailableProcessors()' также берется из той же документации –
, другими словами, кластеризация - это решение, но как получить выгоду от всех 16 ядер одиночной машины с помощью Vert.x? –
Возможно, документация не ясна, но поведение по умолчанию пусковой установки по умолчанию заключается в том, что она всегда будет порождать один цикл событий для ядра процессора. Таким образом, в вашем случае с 16 ядрами вы будете иметь 16 циклов событий. Это максимально увеличит использование вашего ЦП. Ответ здесь: http://vertx.io/docs/vertx-core/java/#_reactor_and_multi_reactor, но не ясно, что он предоставляется из коробки, если вы используете пусковую установку по умолчанию. –