2013년 4월 17일 수요일

apache avro 의 rpc 예제 by java

검색 서비스 제작 중에 외부 서비스를 위한 RESTful 말고, 내부적으로 사용할 고속의 통신 방식을 제공하는 방법을 찾아봤습니다. 일차적으로 유명한 Apache Thrift 를 사용하려다가, Avro 가 맘에 들어, 공부 삼아 예제를 테스트 해 봤습니다.

흠 뭐랄까? 개발하는 입장에서는 Thrift 라 크게 다를 게 없는데... 규격을 정의하는 코드는 차라리 Thrift 가 눈에 더 익어 보이네요^^
다만, Avro 측에서 주장하는 Dynamic 함과 Schema 를 가지고 있다는 것이 향후 확장이라던가, 유연성 측면에서 좋을 것 같더군요...

개인적으로 이거 저거 상세하게 따지지 않고, 맘에 가는 걸 선택합니다... 
향후에 둘 다 지원하면 되니까요^^ 

어쨌든 오늘은 avro 의 serialize/deserialize 예제 말고, 서버와의 통신 (RPC) 예제를 만들어 볼까합니다. (제가 서비스에 사용하기 위해 미리 연습삼아 제작한 것입니다)

예제는 클라이언트가 서버에게 계산을 요청하면, 값을 계산해서 반환하는 계산 서비스를 구현할 것입니다.

우선 준비 사항으로 avro 라이브러리가 필요합니다.

1. maven dependency 에 아래의 avro 관련 라이브러리를 추가합니다.

        avro 1.7.4 와 avro-ipc 1.7.4 를 사용했습니다.   

최신 버전이 1.7.4 더군요. avro-ipc 가 client/server 통신을 하기 위한 라이브러리 입니다.
내부적으로 Netty 를 사용하네요. Netty를 사용한다는 것은 속도면에서 보증받는 거라 보시면 됩니다. ㅋ

2. 다음으로 avro 파일을 java 코드로 생성해주는 avro-maven-plugin 을 정의해 줍니다.




avro-maven-plugin 버전도 1.7.4 더군요^^ 위의 sourceDirectory, outputDirectory 를 보시면, 표준 maven directory로 설정했습니다. 이부분은 각자 변경하시면 됩니다. 
avro 파일들을 찾아 java 클래스로 생성하여 outputDirectory 밑에 생성합니다.

자 이제 본격적으로 Calculator 를 제작해 봅시다.

calculator 를 먼저 정의합니다. avro 파일은 *.avro 가 표준입니다. 
하지만 protocol 인 경우는 *.avpr 을 써야 합니다.

3. calculator.avpr

{
    "namespace": "example.avro.rpc",
    "protocol": "Calculator",

    "types": [],

    "messages": {
        "add": {
                "request":[ { "name": "x", "type": "double"},
                            { "name": "y", "type": "double"} ],
                "response":"double"
            },

          "subtract": {
                "request":[ { "name": "x", "type": "double"},
                            { "name": "y", "type": "double"} ],
                "response":"double"
          }
    }
}

우선 namespace  를 정의하고, protocol 을 정의합니다. 이를 통해 rpc 통신을 한다는 것을 지정했습니다. types 는 사용자 정의 수형을 정의하는 영역입니다. 계산 서비스에서는 double 형만 쓰기 때문에 작업할 것이 없습니다.
다음으로 add, subtract 메소드를 정의했습니다. 
request 는 input parameter 이고, response 는 output parameter 입니다. output parameter 는 이름이 필요 없기 때문에 형식이 생략되었습니다.

이제 maven 에서 generate-sources 를 통해 java 코드를 생성합니다.

4. 생성된 Calculator.java




소스를 보시면 원하는대로 add, subtract 메소드가 정의되었음을 확인할 수 있습니다.
다음으로 실제 서버에서 서비스를 하고, client 에서 호출하여 결과를 볼 수 있는 예제를 제작해 봅시다.

5. CalculatorServer.java





아주 쉽죠^^

저도 처음에 avro가 rpc 를 위해 자체적인 서버가 없는 줄 알았습니다. netty 를 사용한다는 것을 알고는 thrift 보다 avro가 우선순위에 올라오게 되었지요^^

앞으로 내부 서버간의 통신 등에는 avro 를 적극적으로 활용해야겠습니다.

댓글 1개:

Unknown :

보기좋게 정리해주셔서 AVRO 를 이해하는데 큰 도움이 되었습니다.
감사합니다.