1. 분산 어플리케이션 서버를 효율적으로 구축하기 위한 방안
1) RPC(Remote Procedure Call) : 한 컴퓨터가 프로그램을 실행하기 위해 거리에 상관없이 특정 컴퓨터에 서브프로그램을 불러내는 기술을 말한다. 객체지향 개념적으로 보면 멀리 떨어진 컴퓨터에 특정 객체를 불러오는 행위를 말한다.
![](https://t1.daumcdn.net/cfile/tistory/1214D2334F87B6F328)
그림 1) RPC 개념(http://www.cs.fsu.edu/~xyuan/cop5611/lecture2.html)
컴파일된 클라이언트 측에서 사용하는 코드를 이를 stub이라 부르고, 컴파일된 서버 측에서 사용하는 코드를 skeleton이라 부른다. 그리고 스텁이 서버에 접근하기 위해 인터페이스를 사용한다.
- 단점 : 인터페이스 변경 시 매번 IDL을 컴파일해야 함.
2) IDL(Interface Definition Language) : 서로 다른언어로 구현된 프로그램 or 객체가 통신을 하기 위해서 통신을 할 수 있도록 지원하는 언어이다. 이 책에서는 Thrift, Avro를 다뤘다.
개념정리 : http://www.cyworld.com/uchi000/3175980
3) 데이터 타입 : 원격 메소드를 호출 시 주고 받는 데이터(파라미터, 반환값 등)가 int, char[]과 같이 대부분의 프로그래밍 언어에서 제공하는 기본 데이터 타입만을 제공하는 방식과 struct, class와 같은 사용자 정의 데이터 타입을 제공하는 방식으로 구분할 수 있다.
4) 플랫폼(언어) 의존성 : RPC 솔루션이 동일 언어만 가능한지 아닌지 고려해야 한다.
5) 결론
- 가장 이상적인 RPC 구현은 IDL이 없고 사용자 정의 데이터 타입을 자유롭게 사용하고, 다양한 프로그래밍 언어를 사용하는 것이다. 하지만 현실적으로 어려워 RPC 지원 솔루션 중 시스템 요구 사항에 적합한 솔루션을 선택하는 것이 중요하다.
2. Thrift
정의 : 다양한 언어를 지원하는 RPC 서버와 이 서버에서 제공하는 서비스를 호출하는 클라이언트 코드를 생성해주는 소프트웨어 프레임워크이다. Thrift 개발자는 프로그래밍 언어별 소켓 서버에 대한 구현을 알 필요 없으며 RPC기반이기 때문에 함수 호출 형태로 원격 서버에서 제공하는 서비스를 호출할 수 있고, 사용자 정의 데이터 타입을 이용할 수 있다.
![](https://t1.daumcdn.net/cfile/tistory/13212A4A4F87B8F41A)
그림 2) IDL개념도
http://publib.boulder.ibm.com/infocenter/cicsts/v3r1/index.jsp?topic=%2Fcom.ibm.cics.ts31.doc%2Fdfhpj%2Ftopics%2Fdfhpjfe.htm
개발자가 작성한 IDL 파일을 Thrift에서 제공하는 코드 생성기를 이용해 코드로 생성하면 서버측 개발자와 클라이언트 측 개발자가 모두 사용할 수 있는 코드로 만들어진다. 서버 측 개발자는 생성된 코드를 이용해 Thrift에서 제공하는 서버 측 데몬 프로그램 라이브러리를 이용하여 프로그램을 만들고, 클라이언트 개발자는 생성된 코드와 Thrift에서 제공하는 라이브러리를 이용해 서버 측 프로그램을 호출하는 코드를 작성한다.
3. thrift 예제 helloServer
- 너무 고생했다. 책에서는 0.5 버전인데 지금은 0.8버전으로 쓰려다보니 THsHaServer에서 생성자가 정의되지 않았다고 난리를 치는 바람에 구글링 한시간만에 다른코드로 대체해서 결국 돌렸다. ㅡㅡ 오랜만에 다시하는거다 보니 생소하다. 하지만 첫번째 예제 끝!
![](https://t1.daumcdn.net/cfile/tistory/194ADF394F87E8A70E)
그림 3) helloServer 동작
![](https://t1.daumcdn.net/cfile/tistory/184433394F87E8A619)
그림 4) hellClient동작
코드설명 : 서버는 thrift에 변수 나이, 이름을 선언하고 컴파일?하여 몇 천줄의 helloService.java 파일을 만들어 주었다.(이름은 제 마음대로) 이 클래스는 소켓프로그래밍 할 수 있도록 인터페이스를 제공하게 해주었다. 그리고 thrift에서 제공한 라이브러리를 가지고 API사용하여 소켓프로그래밍을 구현했다. Client는 API사용하고 인자 4가지 호스트(루프백), 포트번호, 이름, 나이를 인자로 받아 보내는 역할을 한다.
4. 데이터 직렬화란?
- 파일의 데이터를 읽어올 때나 네트워크를 통해 전송시 스트림 형태로 전송을 하는것을 말함.(일렬로 쭈욱~~~ 나열)
왜냐하면 외부 프로세스와 통신을 하거나 데이터를 파일로 저장하려면 직렬화를 해야하기 때문이다.
Thrift는 RPC(Remote Procedure Call) 요청을 안정적으로 처리하면서 이기종 간 RPC호출을 지원하는 개념이고,
Avro는 데이터 직렬화를 기본 개념으로 하여 RPC 호출을 이기종 간에 가능하게 하는 개념으로 접근한다.