SlideShare a Scribd company logo
1 of 16
Download to read offline
Go로 Push Agent 개선하
기
agun
어쩌다 보니 개발하고 있는 서비스가 0에서 시작해서
하루에 100만 ~ 200만 푸시를 전송하는 서비스가 됨
우리는 스타트업이기에... 처음에는
- 가장 자신있는 JAVA 로 push agent 를 몇시간 만에 뚝딱 개발
- 메시지큐에 대해 경험이 있기 때문에 RabbitMQ를 사용하여 큐잉처리함
- push 전송수가 늘때마다 빠르게 대응하기 위하여 thread를 구현하기
보다는
push agent 의 프로세스를 늘림(구현 복잡도 줄임, 운영복잡도 올라
감)
어쨋든 빠르게 빠르게 빠르게 대응 !!!
그러다가 결국...
- 생각보다 서비스가 잘되었음 (예측 못한 push 전송 숫자 )
- push수가 늘때마다 프로세스를 추가하여 자원낭비
- push 전송 속도의 퍼포먼스가 나오지 않음
(병렬로 함께 동작하는 메시지 DB insert 속도를 못 따라감)
고민함
- JAVA Thread로 구현할까 or 다른 언어로 구현할까?
- 어쨋든 선택의 기준점은 퍼포먼스와 자원절약...
=> JAVA Thread 로 구현하는건 구현 복잡도가 있고 기본적으로
JAVA process 가 차지하는 시스템 비용이 마음에 안드니
다른 언어로 변경하자!!
어떤 언어?
Erlang VS GO
난 GO 보다 오래됬고 풍
부한 레퍼런스가 있어!!
난 신상이고 세련됬어
내 뒤에는 google 형님이 있지
GO로 개발하기 결정 !
시작은 신상에 대한 개인적인 선호도
!!
GO 해보니
- 문서화와 튜토리얼이 잘되어 있음 (한글 포함)
- 개인적으로는 생각보다 러닝커브가 작음
- 성능은 좋고 동작이 가벼움
- 고루틴은 정말 매력적임
- 에러처리가 번거러움
- 간만에 컴파일을 명시적으로 하니 예전 C로 개발했을때가 생각남
어쨋든 써보니 잘바꾸어다고 생각이 들었다 !!
GO 시작하기
- 그냥 공식사이트에서 튜토리얼만 따라해도 어느정도 감잡을수 있음
(https://go-tour-kr.appspot.com/#1 한글 튜토리얼)
- https://golang.org/dl/ 여러 바이너리 배포판이 준비되어 설치가
쉬움
- 스터디나 처음 접하는 경우는 go을 소스 컴파일 설치 보다는 준비된 바
이너리로 설치하기를 추천
Push Agent 개선된점
- 프로세스/메모리 자원 비용이 확 줄어둠
- 고루틴을 이용한 병렬적 처리를 하여 성능 무척 좋아짐
(병렬로 이루어진 메시지 DB insert 속도를 능가함 )
- 생각보다 적은 개발 복잡도와 비용
고루틴의 매력
그냥 아래와 같이 코딩하면 fun1함수는 별도의 thread 에서 실행
go fun1()
아주 쉬운 멀티 쓰레딩 프로그래밍 !!
고루틴이 push agent 와 만났을때(1)
기존
queue
get
message
REQUEST
GCM OR APNS
단일 쓰레드이기 때문에 GCM OR APNS REQUEST 통신이 늦어지면 get message 모듈이
queue 에 쌓인 push 요청을 소비 할 수 없어서 전체 push 전송 프로세스가 늦어짐
고루틴이 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
단점도 있어요
- 언어 자체가 좋고 매력적이지만 사용해야 하는 외부 라이브러리는 아직
베타가 많아요, 어느정도 수정해서 사용해야함
- GOPATH 수동 설정이 좀 불편하다. (이건 내가 형상관리 부분은 아직
안봐서 그럴수도.. )
- panic 처리가 불편함
- 이밖에는 딱히 다른점은 잘 모르겠음
끝으로 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 에서 현재 진행중임
못다한 개발이야기는
http://blog.naver.com/pdc222 에서

More Related Content

What's hot

오픈소스 성능 최적화 보고서 ch07. Infinispan
오픈소스 성능 최적화 보고서 ch07. Infinispan오픈소스 성능 최적화 보고서 ch07. Infinispan
오픈소스 성능 최적화 보고서 ch07. InfinispanHyeonSeok Choi
 
잭블랙이블랙잭을한다 - 최종발표
잭블랙이블랙잭을한다 - 최종발표잭블랙이블랙잭을한다 - 최종발표
잭블랙이블랙잭을한다 - 최종발표Seokmin No
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화Seungmo Koo
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceXionglong Jin
 
05_동기화_개요
05_동기화_개요05_동기화_개요
05_동기화_개요noerror
 
2013년 7월 현재 트렌드에서의 프라우드넷은 어떻게 적응하고 있는가
2013년 7월 현재 트렌드에서의 프라우드넷은 어떻게 적응하고 있는가2013년 7월 현재 트렌드에서의 프라우드넷은 어떻게 적응하고 있는가
2013년 7월 현재 트렌드에서의 프라우드넷은 어떻게 적응하고 있는가Hyun-jik Bae
 
모바일 Rpg 게임서버 리팩토링
모바일 Rpg 게임서버 리팩토링모바일 Rpg 게임서버 리팩토링
모바일 Rpg 게임서버 리팩토링기환 천
 
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위HyeonSeok Choi
 
Java와 go 간의 병렬 프로그램 성능 비교
Java와 go 간의 병렬 프로그램 성능 비교Java와 go 간의 병렬 프로그램 성능 비교
Java와 go 간의 병렬 프로그램 성능 비교Daniel Lim
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012devCAT Studio, NEXON
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP AdvSeungmo Koo
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기Miyu Park
 
너구리연구소
너구리연구소너구리연구소
너구리연구소준상 신
 
너구리연구소(수정)
너구리연구소(수정)너구리연구소(수정)
너구리연구소(수정)준상 신
 
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016devCAT Studio, NEXON
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍Seungmo Koo
 
게임서버프로그래밍 #5 - 데이터베이스 핸들링
게임서버프로그래밍 #5 - 데이터베이스 핸들링게임서버프로그래밍 #5 - 데이터베이스 핸들링
게임서버프로그래밍 #5 - 데이터베이스 핸들링Seungmo Koo
 

What's hot (20)

Chap4_2
Chap4_2Chap4_2
Chap4_2
 
오픈소스 성능 최적화 보고서 ch07. Infinispan
오픈소스 성능 최적화 보고서 ch07. Infinispan오픈소스 성능 최적화 보고서 ch07. Infinispan
오픈소스 성능 최적화 보고서 ch07. Infinispan
 
잭블랙이블랙잭을한다 - 최종발표
잭블랙이블랙잭을한다 - 최종발표잭블랙이블랙잭을한다 - 최종발표
잭블랙이블랙잭을한다 - 최종발표
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
 
05_동기화_개요
05_동기화_개요05_동기화_개요
05_동기화_개요
 
2013년 7월 현재 트렌드에서의 프라우드넷은 어떻게 적응하고 있는가
2013년 7월 현재 트렌드에서의 프라우드넷은 어떻게 적응하고 있는가2013년 7월 현재 트렌드에서의 프라우드넷은 어떻게 적응하고 있는가
2013년 7월 현재 트렌드에서의 프라우드넷은 어떻게 적응하고 있는가
 
모바일 Rpg 게임서버 리팩토링
모바일 Rpg 게임서버 리팩토링모바일 Rpg 게임서버 리팩토링
모바일 Rpg 게임서버 리팩토링
 
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
 
Java와 go 간의 병렬 프로그램 성능 비교
Java와 go 간의 병렬 프로그램 성능 비교Java와 go 간의 병렬 프로그램 성능 비교
Java와 go 간의 병렬 프로그램 성능 비교
 
Mem shrink
Mem shrinkMem shrink
Mem shrink
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
 
너구리연구소
너구리연구소너구리연구소
너구리연구소
 
너구리연구소(수정)
너구리연구소(수정)너구리연구소(수정)
너구리연구소(수정)
 
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
 
게임서버프로그래밍 #5 - 데이터베이스 핸들링
게임서버프로그래밍 #5 - 데이터베이스 핸들링게임서버프로그래밍 #5 - 데이터베이스 핸들링
게임서버프로그래밍 #5 - 데이터베이스 핸들링
 

Similar to Go로 push agent 개선하기

Machine translation survey vol2
Machine translation survey   vol2Machine translation survey   vol2
Machine translation survey vol2gohyunwoong
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드KwangSeob Jeong
 
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)Sang Don Kim
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...hoondong kim
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기JinKwon Lee
 
[테크데이즈2015] 개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요
[테크데이즈2015] 개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요[테크데이즈2015] 개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요
[테크데이즈2015] 개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요Youngjae Kim
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)수보 김
 
버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제Kiyoung Moon
 
I/O Extended 2019 Seoul - What's New in Web
I/O Extended 2019 Seoul - What's New in WebI/O Extended 2019 Seoul - What's New in Web
I/O Extended 2019 Seoul - What's New in WebHanboramRobinJang
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션흥배 최
 
Mobile Push Notification Solution
Mobile Push Notification SolutionMobile Push Notification Solution
Mobile Push Notification Solution남익 이
 
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?주식회사 내일비
 
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?Sang-ho Choi
 
[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱NAVER D2
 
검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPT검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPTTae Young Lee
 
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220Seomgi Han
 
리멤버 데스크톱 앱 개발기
리멤버 데스크톱 앱 개발기리멤버 데스크톱 앱 개발기
리멤버 데스크톱 앱 개발기Tom Kim
 
2015 hi first 스터디 최종보고서
2015 hi first 스터디 최종보고서2015 hi first 스터디 최종보고서
2015 hi first 스터디 최종보고서Seongho Park
 
모니터링 영역의 변천사_클라우드, 디지털 경험까지)
모니터링 영역의 변천사_클라우드, 디지털 경험까지)모니터링 영역의 변천사_클라우드, 디지털 경험까지)
모니터링 영역의 변천사_클라우드, 디지털 경험까지)IMQA
 

Similar to Go로 push agent 개선하기 (20)

Machine translation survey vol2
Machine translation survey   vol2Machine translation survey   vol2
Machine translation survey vol2
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
 
[테크데이즈2015] 개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요
[테크데이즈2015] 개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요[테크데이즈2015] 개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요
[테크데이즈2015] 개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요
 
Etri Retrospect
Etri RetrospectEtri Retrospect
Etri Retrospect
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
 
버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제
 
I/O Extended 2019 Seoul - What's New in Web
I/O Extended 2019 Seoul - What's New in WebI/O Extended 2019 Seoul - What's New in Web
I/O Extended 2019 Seoul - What's New in Web
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
 
Mobile Push Notification Solution
Mobile Push Notification SolutionMobile Push Notification Solution
Mobile Push Notification Solution
 
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
 
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
 
[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱
 
검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPT검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPT
 
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
 
리멤버 데스크톱 앱 개발기
리멤버 데스크톱 앱 개발기리멤버 데스크톱 앱 개발기
리멤버 데스크톱 앱 개발기
 
2015 hi first 스터디 최종보고서
2015 hi first 스터디 최종보고서2015 hi first 스터디 최종보고서
2015 hi first 스터디 최종보고서
 
모니터링 영역의 변천사_클라우드, 디지털 경험까지)
모니터링 영역의 변천사_클라우드, 디지털 경험까지)모니터링 영역의 변천사_클라우드, 디지털 경험까지)
모니터링 영역의 변천사_클라우드, 디지털 경험까지)
 

Go로 push agent 개선하기

  • 1. Go로 Push Agent 개선하 기 agun
  • 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 형님이 있지
  • 7. GO로 개발하기 결정 ! 시작은 신상에 대한 개인적인 선호도 !!
  • 8. GO 해보니 - 문서화와 튜토리얼이 잘되어 있음 (한글 포함) - 개인적으로는 생각보다 러닝커브가 작음 - 성능은 좋고 동작이 가벼움 - 고루틴은 정말 매력적임 - 에러처리가 번거러움 - 간만에 컴파일을 명시적으로 하니 예전 C로 개발했을때가 생각남 어쨋든 써보니 잘바꾸어다고 생각이 들었다 !!
  • 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 에서 현재 진행중임