DeploymentOptions 객체를 사용하면 버티클 배포 옵션을 지정 할 수 있습니다.
배포 옵션으로는 인스턴스의 수, 워커 버티클 여부, 워커 풀 이름, 워커 풀 사이즈 등을 지정 할 수 있습니다.
이 문서에서는 인스턴스 수에 대한 내용을 다루고 있습니다.
배포 옵션(DeploymentOptions)은 버티클을 배포할 때 deployVerticle() 호출 인자로 함께 전달합니다.
DeploymentOptions options = new DeploymentOptions();
vertx.deployVerticle(MyVerticle.class.getName(), options);
setInstances
DeploymentOptions에서 버티클을 배포 할 때 생성되는 인스턴스의 수를 결정합니다.
별도로 지정하지 않았다면 디폴트 1개의 인스턴스를 생성합니다.
public class DeploymentOptions
{
public static final int DEFAULT_INSTANCES = 1;
}
인스턴스의 수를 늘리려면 setInstances() 메소드를 사용합니다.
이렇게 하면 동일한 버티클을 N번 배포한 것과 동일한 결과를 갖습니다.
DeploymentOptions options = new DeploymentOptions();
options.setInstances(4);
vertx.deployVerticle(MyVerticle.class.getName(), options, ar ->
{
if (ar.failed()) {
ar.cause().printStackTrace();
}
});
버티클 인스턴스를 더 많이 배포하게 되면 해당 버티클의 가용성이 높아지게 됩니다.
예를 들어, 버티클 인스턴스 1개가 1분에 5000개의 요청을 처리할 수 있다면 인스턴스를 4개 배포하였을 때 1분에 20000개(5000개*4개 인스턴스)의 요청을 처리 할 수 있게 됩니다.
아래 예시는 4개의 버티클 인스턴스를 배포하고 있습니다.
버티클은 HTTP 요청(http://127.0.0.1:8080/)이 들어오면 자신의 인스턴스 정보를 응답합니다.
public class Launcher extends AbstractVerticle
{
@Override
public void start(Promise<Void> _prom)
{
DeploymentOptions options = new DeploymentOptions();
options.setInstances(4);
vertx.deployVerticle(MyVerticle.class.getName(), options, ar -> {
if (ar.failed()) {
ar.cause().printStackTrace();
}
});
HttpServer httpServer = vertx.createHttpServer();
httpServer.requestHandler(ar -> {
if (0 == ar.uri().compareTo("/")) {
vertx.eventBus().request("/some/eventbus/address", "", in -> {
if (in.succeeded()) {
String res = (String) in.result().body();
ar.response().putHeader("content-type", "text/plain").end(res);
} else {
in.cause().printStackTrace();
ar.response().putHeader("content-type", "text/plain").end(in.cause().getMessage());
}
});
}
}).listen(8080);
_prom.complete();
}
public static class MyVerticle extends AbstractVerticle
{
@Override
public void start(Promise<Void> _prom)
{
vertx.eventBus().consumer("/some/eventbus/address", ar -> {
System.out.println(MyVerticle.this.toString() + "/" + Thread.currentThread().getName());
ar.reply(MyVerticle.this.toString() + "/" + Thread.currentThread().getName());
});
_prom.complete();
}
}
}
코드 | 설명 | |
Line 6:8 | 버티클 배포 | MyVerticle 버티클을 4개의 인스턴스로 배포합니다. |
Line 14:27 | HTTP 서버 생성 | HTTP 서버를 생성하고 Listen합니다. HTTP 서버는 "/" 요청이 들어오면 MyVerticle에 이벤트 버스로 버티클 정보를 요청합니다(이벤트 버스는 버티클 간 통신 채널입니다). |
Line 37:40 | 이벤트 버스 요청 수신 | MyVerticle은 이벤트 버스 요청을 수신하여 자신의 인스턴스 정보를 표시하고 응답합니다. 이때 이벤트 버스 요청은 4개의 인스턴스(배포 옵션으로 지정된)가 Round-Robin으로 수신하게 되므로 요청 건에 대해서 다른 정보가 표시됩니다. |
서버에 HTTP 요청(http://127.0.0.1:8080/)을 반복적으로 보내면 다음과 같이 로깅됩니다.
vertx.Launcher$MyVerticle@65fe5867/vert.x-eventloop-thread-2
vertx.Launcher$MyVerticle@1116e987/vert.x-eventloop-thread-3
vertx.Launcher$MyVerticle@7e3ccb3f/vert.x-eventloop-thread-5
vertx.Launcher$MyVerticle@20fccabc/vert.x-eventloop-thread-4
vertx.Launcher$MyVerticle@65fe5867/vert.x-eventloop-thread-2
vertx.Launcher$MyVerticle@1116e987/vert.x-eventloop-thread-3
vertx.Launcher$MyVerticle@7e3ccb3f/vert.x-eventloop-thread-5
vertx.Launcher$MyVerticle@20fccabc/vert.x-eventloop-thread-4
버티클의 배포 옵션으로 워커 버티클 여부가 지정되지 않았으므로 표준 버티클로 실행되고 있습니다.
표준 버티클은 이벤트 루프 스레드에서 실행되며, 각 인스턴스는 배포된 시점부터 항상 동일한 스레드에서의 실행을 보장합니다.
버티클은 4개의 인스턴스로 배포되었으므로, HTTP 요청을 반복할 시 최대 4번까지 다른 인스턴스의 정보를 표시합니다.
이후 5번째 HTTP 요청은 첫 번째 인스턴스 정보를 표시하게 됩니다.
정리 및 복습
- DeploymentOptions를 사용하면 버티클 배포에 필요한 옵션을 지정 할 수 있습니다.
- DeploymentOptions의
setInstances()를 사용하면 N개의 인스턴스를 배포 할 수 있습니다. - 별도 지정 없이 사용한다면
디폴트로 1개의 인스턴스를 배포합니다. - 하나의 버티클이라도 인스턴스가 여러 개 확보되면 병렬 처리되므로
가용성이 증가합니다.
'Java > Vert.x' 카테고리의 다른 글
버텍스 코어: 버티클 배포 옵션(DeploymentOptions)을 사용한 환경 설정 배포 (0) | 2022.01.31 |
---|---|
버텍스 코어: JSON 사용을 위한 JsonObject (0) | 2022.01.31 |
버텍스 코어: 버티클 팩토리(Verticle Factory) (0) | 2022.01.31 |
버텍스 코어: 버티클(Verticle) (0) | 2022.01.31 |
버텍스 코어: Future와 Composition & Coordination (0) | 2022.01.23 |