자 그럼 펍섭을 위해서는 중간에 토픽을 퍼블리시 받고 서브스크라이버들에게 메시지를 전달하는 서비스가 필요하겠죠?
이 역할을 해주는 솔루션 중 하나가 Nats 입니다. 아주 라이트하고 간단한 설치만으로 사용가능합니다. 리소스도 상당히 적게 먹습니다.
2. Nats - Raspberry Pi에 설치 을 참고하세요.
이렇게 메시지를 미들웨어를 통해서 주고 받으려면 메시지 구조도 명확해야하고 데이터 사이즈도 작은 것이 좋겠죠? 그래서 차용한 것이 구글의 gRPC에서 사용하는 Protocol buffers가 있습니다. 데이터를 직렬화(파일로 저장하거나 바이너리 스트림 형태로 저장하는 행위)하여 작은 용량으로 빠르게 전송하기 위해서 만들어졌다고 보시면 됩니다.
3. Google Protocol Buffers를 참고하세요.
이렇게 만들어진 메시지 구조를 github에 프라이빗 리파지토리에 올려두고 여러 프로젝트에서 공유해서 사용해야 하는데요. 왜냐하면 누군가는 publsh를 하고 누군가는 subscribe를 해야하니까 공유해야겠죠. 그러다 보니 go module을 get 하기 위한 셋팅이 필요합니다. 4. Github private repository에서 Go - import 하기 를 참고하세요.
요약하면 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은 본인이 만드신 것을 사용하시면 됩니다. 에러 없이 잘 들어옵니다.
개발 및 예제 소스
이제 개발 환경은 다 잡혔습니다. 개발만 잘 하면 되겠네요. 아래 소스코드 들어가서 참고하시면 될 듯합니다.