3장.
부트 스트랩: 네티로 작성한 네트워크 애플리케이션의 동작 방식과 환경을 설정하는 도우미 클래스
- 이벤트 루프
- 채널의 전송모드
- 채널 파이프라인
지원하는 설정
- 전송계층(소켓 모드 및 I/O 종류)
- 이벤트 루프(단일 스레드, 다중 스레드)
- 채널 파이프라인 설정
- 소켓 주소와 포트
- 소켓 옵션
부트스트랩의 종류
- ServerBootstrap: for server- 소켓 연결을 대기
- BootStrap: client- 소켓 연결을 요청
서로 API구조는 같지만 소켓 연결에 대한 입장의 차이가 있음.
* 부트스트랩은 빌더 패턴을 사용하면 효율적으로 사용할 수 있음.
- 설정의 내용이 추가될 때마다 생성자를 추가할 필요가 없기 때문.
* 부트스트랩에서 사용할 부모 이벤트 루프 그룹과 자식 이벤트 루프 그룹의 수를 인자로 결정할 수 있다.
- 그룹에서 동작할 스레드 수를 결정하지 않을 경우 하드웨어가 가지고 있는 CPU*2 배의 스레드를 사용한다.
* 부트스트랩에서 사용할 이벤트루프 그룹의 종류는 생성할 때 NIO/ OIO/ EPOLL eventgroup 클래스로 생성을 하느냐에 달려있다.
- NIO: 넌블락
- OIO: 블락
- EPOLL : 이폴 지원
---
ServerBootstrap의 API
* ServerBootstrap.class - group(eventLoopGroup group);
- 이벤트 루프 그룹을 BootStrap의 변수에 설정하고 Bootstrap 객체 자신을 리턴한다.
- override 한 group(group)의 기능 내에서 사용하는 group(group, group) 기능은 부모와 자식 이벤트 루프를 구분해서 사용할 수 있게 한다.
* Channel()
- 소켓의 입출력 모드를 설정
- 여~러가지 종류가 있다.
* ChannelFactory
- 소켓의 입출력 모드를 설정
- ChannelFactory 인터페이스를 구현가능
* Handler
- 이벤트를 처리하는 녀석.
- 빌더 패턴으로 핸들러 객체를 설정해서 넣으면 이벤트가 발생했을 때 실행될 핸들러를 설정할 수 있다.
- ChannelHandler 인터페이스 구현체를 인자로 받는다
* ChildHandler
- 클라이언트 소켓 채널로 송수신 되는 데이터를 가공하는 데이터 핸들러 설정할 수 있다.
- 빌더 패턴으로 Handler와 같이 ChannelHandler 인터페이스 구현체를 인자로 받는다
- 예를 들어 Handler 대신 ChildHandler를 사용해서 로그핸들러를 인자로 설정하면 클라이언트에서 발생한 이벤트까지 로그로 찍을 수 있다.(로그 핸들러가 아니면서 양쪽의 이벤트를 모두 필요로 하는 경우는 어떤 것이 있을지 잘 모르겠다.)
* option
- 서버 소켓 채널의 소켓 옵션을 설정하는 API
- 소켓 옵션: 소켓의 동작 방식을 지정하는 거엇.
- 주요 소켓 옵션이 있다~
** ChannelOption.TCP_NODELAY
- 네이글 알고리즘의 비활성화 여부 설정
- 네이글 알고리즘: 가능하면 데이터를 나누어 보내지 말고 한꺼번에 보내라는 원칙을 가진 알고리즘.
- 네트워크 상태가 좋지 않고 대역폭이 좁을 때 헤더로 인한 불필요한 오버헤드를 줄이고 데이터를 모아서 보내라.
- 작은 크기의 데이터는 송신버퍼에서 적당히 모아서 보낸다.
- 이전에 보내내 패킷의 ACK를 받아야 다음 패킷을 전송한다.
- 이 옵션은 ACK를 받을 떄까지 다음 패킷을 전송하지 않기 때문에 빠른 속도가 필요할 때는 문제가 된다.
** ChannelOption.SO_REUSEADDR
- TCP 통신을 종료할 때 클라이언트에서 마지막으로 FIN을 보내고 나서 발생하는 타임아웃으로 인해 어플리케이션 서버가 재시작 하려고 하면 bind 실패로 망함.
- 이 옵션을 켜주면 TIME_WAIT에 걸려있더라도 bind 가능함
** ChannelOption.SO_BACKLOG
- 동시에 수용 가능한 클라이언트 연결 요청 개수를 서버 소켓에 설정 가능한 옵션
- 그런데 이 개수가 서버 소켓이 소화가능한 동시 연결수와 동일하지 않다.
- SYN-ACK상태의 연결요청을 보관하는 큐의 크기를 설정하는 것이 바로 SO_BACKLOG
- 너무 크게 잡으면 연결이 폭주할 때 연결 대기 시간이 길어지는 단점이 있음.
* childOption
- 클라이언트 소켓 채널에 소켓 옵션을 설정.
**SO_LINGER
- 소켓 종료 시, close함수가 실행되었는데 아직 커널 버퍼에 전송되지 않은 데이터가 남아있을 경우 이를 처리하는 방법을 지정하는 옵션.
- 이 옵션의 사용 여부/ 타임아웃 값 설정 가능
- FALSE가 디폴~ㅌ
- 이 옵션을 사용하고 타임아웃값을 0으로 주면 마지막 남은 데이터를 모두 전송하고 연결을 끊어버림. TIMEWAIT 발생하지 않는 장점이 있음.
---
Bootstrap API
- ServerBootstrap 과 Bootstrap API는 대체로 비슷하다.
- 그러나 부모-자식 관계에 대한 API 는 없다.(option- childOption)
* group
- 이벤트 루프 객체를 설정.
- 하나의 이벤트 루프 객체만 설정 가능하다. (부모-자식 설정 불가하기 때문)
- AbstractBootstrap의 그룹 메소드를 고대로 사용.
* channel
- 클라이언트 소켓 채널의 입출력 모드를 설정.
- 요러저러한 클래스 목록이 있다. p94
* channelFactory
- ServerBootstrap의 그것과 같은 역할.
* handler
- 클라이언트 소켓 채널에서 발생하는 이벤트를 수신하여 처리.
- ChannelInitializer를 구현해서 사용
-
* option
- 클라이언트의 소켓 설정을 옵션 설정.
'일지' 카테고리의 다른 글
intelliJ에서 live template 생성할 때 유의해야 하는 점들 정리 (0) | 2016.02.23 |
---|---|
git remote branch delete (0) | 2016.02.19 |
천사소녀 네티 6장 (0) | 2016.02.17 |
천사소녀 네티 (0) | 2016.02.10 |
nerd commenter (0) | 2016.01.28 |