2013-07-22 2 views
6

이 질문은 트롤처럼 보일지 모르지만 사실 verticle 자체가 전용 ​​스레드에서 실행되기 때문에 vert.x가 동시성을 관리하는 방법에 관한 것입니다. 자바로 작성된이 간단한 vert.x의 HTTP 서버에서Vert.x에는 단일 버텍스에 대한 실제 동시성이 있습니까?

살펴 보자 :

import org.vertx.java.core.Handler; 
import org.vertx.java.core.http.HttpServerRequest; 
import org.vertx.java.platform.Verticle; 

public class Server extends Verticle { 
    public void start() { 
     vertx.createHttpServer().requestHandler(new Handler<HttpServerRequest>() { 
      public void handle(HttpServerRequest req) { 
       req.response().end("Hello"); 
      } 
     }).listen(8080); 
    } 
} 

는 지금까지 내가이 문서를 이해,이 모든 파일이 verticle을 나타냅니다. 그래서 시작 메서드는 전용 verticle 스레드 내에서 호출됩니다. 그러나 requestHandler는 어디에서 호출 되었습니까? 이 스레드에서 정확히 호출 된 경우 node.js.보다 어디에서 볼 수 있는지 알 수 없습니다.

나는 네트워크/동시성 라이브러리 vert.x가 기반 인 Netty에 익숙하다. 모든 수신 연결은 전용 스레드로 매핑됩니다.이 스레드는 매우 정교하게 확장됩니다. 그래서 .. 들어오는 연결이 꼭지점을 나타내는 것을 의미합니까? 그렇다면 버티컬 인스턴스 "서버"는 어떻게 그 클라이언트와 통신 할 수 있습니까? 사실이 개념은 Node.js만큼 제한적이라고 말할 수 있습니다.

개념을 이해하는 데 도움주세요.

감사합니다, 크리스

+0

netty에는 스레드와 연결 사이에 고정 된 매핑이 없습니다. 이는 실제로 클래식 java.io 동기 I/O보다 중요한 이점입니다. 실제 작업이있을 때만 스레드 풀에서 스레드가 모집됩니다. –

+1

verticle의 핵심 원리는 모든 이벤트가 단일 스레드에 의해 제공된다는 것입니다 (또는 최소한 특정 verticle에 대한 모든 이벤트가 순차적으로 실행 됨). 따라서 Vert.x는 하나의 verticle에 대해 동시성을 갖지 않으며, 그 점이 중요합니다. –

답변

4

내가 아주 vert.x에 참여 그는 내가 "동시성"문제에 대한 기본적으로 옳다 말해 줬어 누군가에게 얘기했습니다.

하지만 그는 "스케일링 서버"가 자세히 설명되어있는 곳에서 내가 놓친 문서 섹션을 보여주었습니다.

기본 개념은 버텍 티클을 작성할 때 단일 코어 성능 만 가지는 것입니다. 그러나 주어진 verticle의 얼마나 많은 인스턴스가 실행되는지 정의하는 -instance 매개 변수를 사용하여 vert.x 플랫폼을 시작할 수 있습니다. Vert.x는 후드 아래에서 약간의 마법을 사용하여 10 개의 서버 인스턴스가 10 개의 서버 소켓을 열려고 시도하지 않고 실제로는 하나의 서버 소켓을 열려고 시도합니다. 이 방법으로 vert.x는 단일 verticle에 대해서도 수평 확장이 가능합니다.

이것은 정말 훌륭한 개념이며 특히 훌륭한 프레임 워크입니다 !!

0

모든 verticle은 단일 스레드이며, 시작할 때 vertx 서브 시스템은 해당 verticle에 이벤트 루프를 지정합니다. 해당 verticle의 모든 코드는 해당 이벤트 루프에서 실행됩니다. 다음 번에 http://groups.google.com/forum/#!forum/vertx에서 질문을해야 할 때 그룹이 매우 활발하게 활동할 것이고 귀하의 질문은 즉시 답변 될 것입니다.

1

당신이 올바르게 답변했기 때문에 정점은 비동기 비 차단 프로그래밍 (node.js와 같은)을 사용하므로 그렇지 않으면 전체 (응용 프로그램) 세계가 돌아 가지 않기 때문에 차단 작업을 수행 할 수 없습니다.

정확하게 동일한 TCP/HTTP 포트에서 수신 대기중인 (n = CPU 코어) verticle 인스턴스를 생성하여 서버를 확장 할 수 있습니다.

    :이 Node.js를 비교 빛난다

    는 JVM 자체가 (자바 등 등의 형태 보증을 포함하지 않는,보기의 실행 지점에서) 더 많은 이점을 제공하는 멀티 스레드 점이다

  • 다중 스레드 (교차점) 통신은 여전히 ​​스레드 안전 액터와 같은 모델로 제한되지만 IPC (Inter Process Communication)는 버텍 사이에서 메시지를 전달할 필요가 없습니다. 모든 것은 동일한 프로세스, 동일한 메모리 영역 내에서 발생합니다. 노드보다 빠릅니다.JS 새로운 시스템 프로세스의 모든 갈래의 작업을 산란 및 컴퓨팅 무거운 및/또는 동일한 JVM 프로세스 내에서 작업을 차단 할 수
  • 능력 통신하기 위해 IPC를 사용하여 : http://vertx.io/docs/vertx-core/java/#blocking_code 또는 http://vertx.io/docs/vertx-core/java/#worker_verticles
  • V8에 비해 핫스팟 JVM의 속도 :)을
+0

또한 서버 측에서 V8을 사용하지 않기로 한 점과 nodej가 어느 시점에서 발생했기 때문에 JavaScript는 원시 성능의 시작점으로 매우 좋지 않습니다. JVM은 항상 성능을 위해 C/C++과 경쟁을 벌였으며 서버 측 사용에 대한 오랜 역사가 있습니다. 이것이 바로 지금 매우 빠른 이유입니다. https://www.cubrid.org/blog/inside-vertx-comparison-with -nodejs –

관련 문제