golang + websocket 서버 프로그래밍
상황 - 서버개발 혼자, 코드 첫줄부터 어드민까지 6주
자동화 CI 배포 구축. (메소스, 마라톤, 등등)
고랭에 불안감이 좀 사라진 상태. (고랭 6~7개월차)
---
죽지않는 서버를 만들기위해 TDD
ㄴ 테스트 패키지 통해서 -race 옵션으로 부하가 어디 걸리는지 체크해보고.
- GoCD (CI.CD 툴)
ㄴ git에 올려서 도커 이미지 빌드 했구.
- mesos - 마라톤
ㄴ 인스턴스 비정상 종료시, 페일오버 전략을 진행.
- 엔그라인더 부하테스트.
ㄴ 테스트 스크립트는 자이썬을 써 에러율 확인. - 엔그라인더에서 좀 덜뜨길래 메소스 제한 걸린거 풀어줌... (뭐였지 기억안남)
- 메모리 고루틴 회수 체크.
ㄴ 어드민 페이지 생성. 뷰로짬.
ㄴ 사용율이랑 메모리 스택같은거 가져와서 확인용으로 빠르게 만듬.
-------
방법론에 대한 고민을 하게 됨.
고랭철학 CPS ( 순차 프로세스 통신)
ㄴ 채널 채널 채널
ㄴ 구글에서 일어나는 다양한 동시성에 환멸을 느껴 만든 프로젝트 언어.
ㄴ 약간 객체지향 부정적.
ㄴ Rob Pike
동시성
ㄴ 한꺼번에 많은 일을 다루는 것 (순차성이 중요함)
병렬성
ㄴ 많은 일을 한꺼번에 실행.
적당한 개발론을 고민.
- Mutex vs Channel
> 가장 빨리만나는 고 책을 참고했는뎅,
400만개 append 해서 500ms
언 버퍼드 채널로 했을 경우.
-- 테스팅을 해봄.
뮤택스는 400만개 다했고.
채널은 230만개 된 상황.
---- 잘되길래 뮤택스로 코딩을 했더니 데드락 같은걸 느낌.
커뮤니케이팅을 통해 메모리를 공유하라.
고루틴간의 대화를 뮤텍스 보호에 너무 의존 하지 말 것.
그래서 뮤텍스 제거를 들어감.
stateful한 코드를 제거해 나감.
> 채널을 통해서 상태를 관리했음. leave채널이나, live채널에 넣는 식으로.
라이브러리를 고를때도 뮤텍스가 적거나 없는걸로 .
range, close, select
-----
고루틴 릭
- 뮤텍스 싸잉 안맞음.
- 샌더가 없는데, 리시버가 있거나
- 리시버가 없는데, 샌더가 있는경우.
defer 호출로 panic이 발생하면 send
defer HandlePanic()
닫힌 채널에 뭔가 값을 계속 보낼 떄. 이런걸 받았음.
- 고루틴을 닫는 타이밍을 고려...
-------
웹소캣 서버를 만들어야했고.
- 고 소캣 iO에서 브로드케스트 락 해제 관련 이슈가 있었고.
필요한 부분만 가지고와서
고릴라 웹소켓을 쓰고.
- 웹소캣 지원안하는 폰은 버리고.
- cors, origin 옵션문제도 여기 넣을 수 있음.
리드펌프 / 라이트 펌프 2개의 고루틴이 돌아감.
---------
- 7가지 동시성 모델 책.