Netty - 1.소개

roon-replica·2022년 6월 22일
0

server

목록 보기
2/4
post-thumbnail

서론

  • 네티는 고성능, 네트워킹 애플리케이션 제작을 위한 프레임워크라고 함
  • 특징
    • 네트워킹 전문가가 아니라도 네티로 네트워킹 애플리케이션을 제작할 수 있다고 함
    • 자바 표준 API를 이용하는 것보다 네티를 이용하는게 더 쉽다고 함
    • 애플리케이션 논리를 네트워크 레이어로부터 분리할 수 있다고 함

자바의 네트워킹

java.net

  • 최초의 자바 네트워킹 API(java.net)은 시스템 소켓 라이브러리(?)가 제공하는 블로킹 함수만 지원했다고 함
ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
// 여기서 accept()가 서버 소켓에 연결될 때까지 블로킹하고, 연결되면 소켓을 반환한다고 함.
  • 위 코드는 한 번에 한 연결만 처리한다고 함..
    그래서 heap, stack 메모리 낭비가 되고
    스레드가 많아지면 컨텍스트 스위치에 따른 오버헤드가 문제가 된다고 함..

java.nio

  • 논블로킹 설계는 이렇다고 함..

    • java.nio.channels.Selector 클래스가 자바 논블로킹 입출력 구현의 핵심이라고 함
      baeldung / java nio selector 소개
    • Selector가 여러 NIO channel을 모니터링해서 어떤 채널이 데이터 전송을 위해 사용될 수 있는지 알아낸다고 함
      그래서 한 스레드로 여러 동시 연결을 처리할 수 있음
    • 논블로킹 소켓 집합에서 입출력이 가능한 것들을 지정하기 위해 이벤트 통지 API를 쓴다고 함.....
  • java.nio API를 올바르게 이용하기는 어렵다고 함. 그래서 Netty를 써야한다고 함.

네티 소개

개요

  • 수십만 동시 사용자를 지원하는 것은 당연한 수준이 되었다
  • 저수준 API를 직접 이용하면 복잡성이 심화되고, 인력도 구하기 어렵다고 함.
    그래서 복잡성을 단순한 추상화로 감싸는 객체 지향의 기본 개념을 도입했다고 함
  • 높은 처리량, 규모 가변성?, 낮은 비용을 고려해야 한다고 함

비동기식 + 이벤트 기반 네트워킹

  • 비동기이면서 이벤트 기반인 시스템은 특수하고 유용한 행동 유형을 보여준다고 함
    -> 발생하는 이벤트에 대해 순서에 관계없이 응답할 수 있다??

  • 논블로킹 네트워크 연결은 작업 완료를 기다릴 필요가 없게 해준다고 함
    비동기 메서드는 더 나아가서 즉시 반환하며, 작업이 완료되면 직접 또는 나중에 이를 통지하는 것!
    (그래서 논블로킹이랑 비동기랑 좀 다르다는 거지? 비동기는 작업이 완료되었을 때 통지하는 게 추가된 거 같은데)
    결론적으로 논블로킹 입출력?을 이용하면 더 많은 이벤트를 빠르고 경제적으로 처리할 수 있다고 함..

네티의 핵심 컴포넌트

1. Channel

  • java.nio.channels.Channel
  • 입출력 작업을 위한 연결이라고 함

2. callback

  • MDN - callback function
  • callback function F1은 다른 function F2에 argument로 전달되어 F2 내에서 실행되는 함수를 의미함
    (더 넓게는 어떤 실행가능한 코드에 대한 레퍼런스를 전달하는 것도 의미하는듯)

3. Future

  • java.util.concurrent.Future
  • 작업이 완료되면 애플리케이션에 알리는 한 방법(JS에서 Promise 같은 역할이라 보면 되겠지)
  • java의 Future에는 작업 완료를 수동으로 확인하거나, 완료 전까지 블로킹하는 기능만 있어서
    자체 구현인 ChannelFuture를 제공한다고 함
    ChannelFutureListener라는 게 있다고 함. 작업이 완료되면 리스너의 콜백 메서드가 호출되서 알림을 준다고 함.
Channel channel = ...;
ChannelFuture future = channel.connect(...);

future.addListener(new ChannelFutureListener()){
  @Override
  public void operationComplete(ChannelFuture future){
    if(future.isSuccess()) { ... }
    else { // printStackTrace(); }
  }
}

// 이렇게 하면 자동으로 작업 완료를 검사해서 알림을 준다는데..
// 이벤트 리스너라는건 어떻게 완료 여부를 아는건지?
// 내부적으로는 계속 반복적으로 완료 여부 검사하는 방식인가?
// 아니면 다른 방법..?

4. 이벤트와 핸들러

  • 발생한 이벤트를 기준으로 적절한 동작을 트리거할 수 있다고 함..
  • 동작
    • 로깅
    • 데이터 변환?
    • 흐름 제어?
    • 애플리케이션 논리?
  • 이벤트 분류
    • 인바운드
      • 연결 열기/닫기
      • 데이터 읽기?
      • 사용자 이벤트
      • 오류 이벤트
    • 아웃바운드
      • 연결 열기/닫기
      • 소켓으로 데이터 쓰기, 플러시?

생각들

  • 네트워킹 애플리케이션이 뭐지? 네트워크 안 타는 애플리케이션도 있나?
  • JVM이 스레드 몇개까지 지원 가능함?
    -> 이론적으로는 user address space for stack / thread stack size
    thread stack size = 1MB, user address space = 4GB라고 하면
    4000개 정도 만들 수 있는건가?
  • 이벤트 통지 API가 뭔지 모름
  • 비동기, 이벤트 기반이면 순서에 관계없이 응답할 수 있다는게 정확히 무슨 말인지 모르겠음
  • callback과 Future가 상호 보완적이라는게 어느 부분이?
  • 인바운드 / 아웃바운드 이벤트 개념 어색함
profile
집중 ➝ 프로세서↑ 시간 투자 ➝ 디스크↑

0개의 댓글