2. 어쩌다 보니 개발하고 있는 서비스가 0에서 시작해서
하루에 100만 ~ 200만 푸시를 전송하는 서비스가 됨
3. 우리는 스타트업이기에... 처음에는
- 가장 자신있는 JAVA 로 push agent 를 몇시간 만에 뚝딱 개발
- 메시지큐에 대해 경험이 있기 때문에 RabbitMQ를 사용하여 큐잉처리함
- push 전송수가 늘때마다 빠르게 대응하기 위하여 thread를 구현하기
보다는
push agent 의 프로세스를 늘림(구현 복잡도 줄임, 운영복잡도 올라
감)
어쨋든 빠르게 빠르게 빠르게 대응 !!!
4. 그러다가 결국...
- 생각보다 서비스가 잘되었음 (예측 못한 push 전송 숫자 )
- push수가 늘때마다 프로세스를 추가하여 자원낭비
- push 전송 속도의 퍼포먼스가 나오지 않음
(병렬로 함께 동작하는 메시지 DB insert 속도를 못 따라감)
5. 고민함
- JAVA Thread로 구현할까 or 다른 언어로 구현할까?
- 어쨋든 선택의 기준점은 퍼포먼스와 자원절약...
=> JAVA Thread 로 구현하는건 구현 복잡도가 있고 기본적으로
JAVA process 가 차지하는 시스템 비용이 마음에 안드니
다른 언어로 변경하자!!
6. 어떤 언어?
Erlang VS GO
난 GO 보다 오래됬고 풍
부한 레퍼런스가 있어!!
난 신상이고 세련됬어
내 뒤에는 google 형님이 있지
9. GO 시작하기
- 그냥 공식사이트에서 튜토리얼만 따라해도 어느정도 감잡을수 있음
(https://go-tour-kr.appspot.com/#1 한글 튜토리얼)
- https://golang.org/dl/ 여러 바이너리 배포판이 준비되어 설치가
쉬움
- 스터디나 처음 접하는 경우는 go을 소스 컴파일 설치 보다는 준비된 바
이너리로 설치하기를 추천
10. Push Agent 개선된점
- 프로세스/메모리 자원 비용이 확 줄어둠
- 고루틴을 이용한 병렬적 처리를 하여 성능 무척 좋아짐
(병렬로 이루어진 메시지 DB insert 속도를 능가함 )
- 생각보다 적은 개발 복잡도와 비용
11. 고루틴의 매력
그냥 아래와 같이 코딩하면 fun1함수는 별도의 thread 에서 실행
go fun1()
아주 쉬운 멀티 쓰레딩 프로그래밍 !!
12. 고루틴이 push agent 와 만났을때(1)
기존
queue
get
message
REQUEST
GCM OR APNS
단일 쓰레드이기 때문에 GCM OR APNS REQUEST 통신이 늦어지면 get message 모듈이
queue 에 쌓인 push 요청을 소비 할 수 없어서 전체 push 전송 프로세스가 늦어짐
13. 고루틴이 push agent 와 만났을때(2)
개선
queue
get
message
REQUEST
GCM OR APNS
GCM OR APNS REQUEST모듈은 고루틴에 의해 별도의 thread 로 실행되어 통신이 늦어지더
라도 get message 모듈은 queue 에서 push 요청을 소비하여 GCM OR APNS 통신을 계속 요청
할 수 있음
REQUEST
GCM OR APNS
go
14. 단점도 있어요
- 언어 자체가 좋고 매력적이지만 사용해야 하는 외부 라이브러리는 아직
베타가 많아요, 어느정도 수정해서 사용해야함
- GOPATH 수동 설정이 좀 불편하다. (이건 내가 형상관리 부분은 아직
안봐서 그럴수도.. )
- panic 처리가 불편함
- 이밖에는 딱히 다른점은 잘 모르겠음
15. 끝으로 RabbitMQ 연동 삽질 팁
다른 사람들은 삽질 않길 ...
- https://github.com/streadway/amqp 이용하여 RabbitMQ consumer 구현시
connection 이 끊기면 먹통이 됨..
https://github.com/streadway/amqp/blob/master/reconnect_test.go 를 참고하여 반드시 reconnect 를 구현 추천
Reconnect 에 대한 개선은 https://github.com/streadway/amqp/issues/133 에서 현재 진행중임