본문 바로가기
프로그래밍

Pub-Sub 구현 : Go + Google Protocol Buffers + Nats + Github.com

by 자유인 JS Yoon 2021. 7. 30.

Pub-Sub 구현 하면서 처음 사용하는 환경으로 고생을 많이 했습니다. 그래서 정리해 둡니다.

우선 pub-sub은 언제 사용할까요? 개념은 도대체 뭘까요? 요기 참고 사이트에서 확인하세요.

https://kchanguk.tistory.com/75

 

자 그럼 펍섭을 위해서는 중간에 토픽을 퍼블리시 받고 서브스크라이버들에게 메시지를 전달하는 서비스가 필요하겠죠?

이 역할을 해주는 솔루션 중 하나가 Nats 입니다. 아주 라이트하고 간단한 설치만으로 사용가능합니다. 리소스도 상당히 적게 먹습니다. 

2. Nats - Raspberry Pi에 설치 을 참고하세요.

 

이렇게 메시지를 미들웨어를 통해서 주고 받으려면 메시지 구조도 명확해야하고 데이터 사이즈도 작은 것이 좋겠죠? 그래서 차용한 것이 구글의 gRPC에서 사용하는 Protocol buffers가 있습니다. 데이터를 직렬화(파일로 저장하거나 바이너리 스트림 형태로 저장하는 행위)하여 작은 용량으로 빠르게 전송하기 위해서 만들어졌다고 보시면 됩니다.

3. Google Protocol Buffers 를 참고하세요.

 

이렇게 만들어진 메시지 구조를 github에 프라이빗 리파지토리에 올려두고 여러 프로젝트에서 공유해서 사용해야 하는데요. 왜냐하면 누군가는 publsh를 하고 누군가는 subscribe를 해야하니까 공유해야겠죠. 그러다 보니 go module을 get 하기 위한 셋팅이 필요합니다.
4. Github private repository에서 Go - import  하기 를 참고하세요.

 

제가 공부하면서 만든 프로그램 소스는 5. 개발 및 예제 소스 에 공유해두었습니다.

 

험난했던 여정이었습니다만... 여러분은 쉽게 접근해서 개발에 한번 적용해보시길 바래요.


  1. 기술 사용 환경
  2. Nats - Raspberry Pi에 설치
    • 설치 참고 사이트 : https://docs.nats.io/nats-server/installation
    • 순수 테스트만을 원하시면 굳이 Nats 설치 안하셔도 되고, nats://demo.nats.io 로 접속하시면 됩니다.
    • 쉘에서 다음과 같이 입력하시면 설치 됩니다.
      $ GO111MODULE=on go get github.com/nats-io/nats-server/v2​
      $ nats-server
      [41634] 2019/05/13 09:42:11.745919 [INF] Starting nats-server version 2.0.0
      [41634] 2019/05/13 09:42:11.746240 [INF] Listening for client connections on 0.0.0.0:4222
      ...
      [41634] 2019/05/13 09:42:11.746249 [INF] Server id is NBNYNR4ZNTH4N2UQKSAAKBAFLDV3PZO4OUYONSUIQASTQT7BT4ZF6WX7
      [41634] 2019/05/13 09:42:11.746252 [INF] Server is ready
      
      $ sudo mkdir /etc/nats
      $ sudo vi /etc/nats/server.conf
      host: 0.0.0.0
      port: 4222
      listen: 0.0.0.0:4222
      
      debug: true
      trace: true
      logtime: true
      logfile_size_limit: 1GB
      log_file: "/home/pi/nats-server.log"
      
      $ # Run Nats Server
      $ nats-server -c /etc/nats/server.conf -m 8222
      $ tail -f /home/pi/nats-server.log
    • 이제 로그를 모니터링 하고 계시면 디버그 및 트레이싱 메시지들이 나타나서 어떤 작업들이 들어오는지 확인이 가능해집니다.
    • pub-sub 설명 :
      설명 - https://docs.nats.io/developing-with-nats/tutorials/pubsub
      소스코드  - https://github.com/nats-io/nats.go/tree/master/examples
  3. Google Protocol Buffers
    • Overview : https://developers.google.com/protocol-buffers/docs/overview
    • 내려받기 : https://github.com/protocolbuffers/protobuf
    • https://bcho.tistory.com/1182 : 조대협님 블로그 (좋은 자료 늘 감사함돠~)
      조대협님 블로그 보시고 설치 하시면 본인 환경에 맞춰 설치하시면 됩니다.
    • Proto 파일 생성 (./define/matchrequest/request.proto)
      syntax = "proto3";
      import "google/protobuf/timestamp.proto";
      
      package pb_msg;
      // go_package로 소스 패키지 생성을 함
      option go_package = "github.com/jongsin/nats-protos/go/message";
      
      message MatchRequest {
      	google.protobuf.Timestamp   request_date     =1;
      	bool        is_public           =2;
      	string      save_path           =3;
      	string      save_file_name      =4;
      	string      title               =5;
      	string      content             =6;
      }​
    • shell 파일을 만들어서 Proto 를 컴파일 하기 (원하는 언어별로 옵션을 추가해준다. 폴더도 미리 생성하고 실행) 
      #!/usr/bin/env bash
      PREFIX="github.com/jongsin/nats-protos"
      
      protoc --proto_path=./define/matchrequest \
      --go_opt=module=$PREFIX \
      --go_out=. \
      --js_out=./js/matchrequest \
      --java_out=./java/matchrequest \
      --python_out=./python/matchrequest \
      ./define/matchrequest/request.proto​
  4. Github private repository에서 Go - import  하기
    • 고랭이는 개인 리파지토리의 패키지를 import 하게 되면 못 땡겨요~~~ 에러납니다. (짜증 만땅납니다. ㅠㅠ)
    • 참고 사이트 : https://mingrammer.com/go-modules-private-repo/
      • 요약하면 go get을 하여 모듈을 가져오는 경우
        - https://proxy.golang.org 에서 미러링된 모듈 검색
        - 없으면 direct 에서 검색
        - 모듈을 발견하면 다운 받은 후 go.sum 에서 체크섬 유무 검사
        - 체크섬을 발견하지 못하면 https://sum.golang.org 에서 체크섬 값을 가져와서 go.sum 파일 업데이트
      • 프라이빗 모듈의 경우 체크섬 값을 가져올 방법이 없으니 모듈 로딩하다가 에러가 나겠지요?
        그런 경우 해결 방법은 체크섬 DB를 만들어서 서비스 하거나 체크섬을 건너 뛰게 하면 되겠습니다만... 체크섬DB 구성하고 하려면 복잡하니까 그냥 건너 뛰게 하면 간단히 해결 될 듯 합니다.
      • go 글로벌 환경 값을 아래와 같이 추가해주면, account1, account2에 있는 모듈을 호출 하는 경우  proxy 건너 뛰고, 체크섬 건너 뛰게 됩니다. 간단하쥬???
        $ go env -w GOPRIVATE=github.com/account1,github.com/account2​
      • 사실 이게 끝이 아닙니다. github.com에 보시면 모듈로 릴리즈를 해주셔야 합니다.
        아래 캡쳐한 화면 우측에 Releases 보이시죠? 릴리즈를 클릭합니다.
        화면에서... New Release 버튼을 클릭하세요
        다음으로는 아래 폼에 데이터를 입력합니다.
        특히 맨 위에 있는 입력값은 버전 값으로 우측에 태깅 관련 입력 방법이 있으니 참고하셔서 입력하시면 됩니다.
        나중에 go get 으로 땡기면 버전을 이 값으로 받아 들입니다. 물론 버전에 따라서 로딩하는 버전이 다르니 추가되거나 한 값을 못 읽을 수 있습니다. 참고하셔서 자~알 사용하시면 됩니다.


      • go get github.com/jongsin/nats-protos
        리파지토리 URL은 본인이 만드신 것을 사용하시면 됩니다. 에러 없이 잘 들어옵니다. 
  5. 개발 및 예제 소스

 

간단히 최근 1주일 사이에 스터디한 내용을 정리해서 올려봤습니다.

더 좋은 방법이나 예제 등이 있으시면 댓글이나 메시지 남겨주세요.

댓글0