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가지 동시성 모델 책.




+ Recent posts