본문 바로가기

Java/Vert.x

버텍스 코어: 배포 옵션(DeploymentOptions)을 사용하여 버티클 배포 인스턴스 확보

더보기

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개의 인스턴스를 배포합니다.
  • 하나의 버티클이라도 인스턴스가 여러 개 확보되면 병렬 처리되므로 가용성이 증가합니다.