NodeJS 로 만든 웹서버 무중단 업데이트 하는거 구글에서 찾아보니까
죄 서버 두 대 이상 개설해놓고, 순차적으로 서버 하나씩 죽이고 다시 실행하는걸
반복해나가는 방식이더라
말이 무중단이지, 실제로는 인스턴스 죽였다가 키는 거잖아?
그 순간 해당 인스턴스에 접속해있던 사람들은 모두 황천행...
-----
-----
그래서 본인은 NodeJS 로 웹서버 만들 때,
무중단 업데이트 기능만큼은 직접 구현해서 쓰고 있다.
원리는 간단해서 NodeJS 로 만든 웹서버 프로그램에서
마스터 프로세스는 오로지 네트워크 통신만을 전담하고
주 작업은 슬레이브 프로세스에 넘기는 방식임
마스터 프로세스에 SharedMutex (읽기/쓰기락이 모두 가능한 mutex) 하나 냅두고
클라이언트로부터의 작업 요청 때는 읽기락을 걸고
무중단 업데이트가 필요할 때는 쓰기락을 걸고 슬레이브 프로세스들을 재가동하는 거임
이렇게 하면 업데이트가 필요하다해서 기존에 접속해있던 클라이언트가 황천가는 일은 결코 없거든
더불어 이렇게 하면 싱글 스레드 기반의 서버 프로그램이 아니라
멀티 프로세스를 활용하는 서버를 만들 수도 있지.
-----
-----
그냥 간단한 스킬에 간단한 아이디어인데
이거 라이브러리화시키면 꽤나 유용하지 않을까 생각함
물론, 이걸 사용하려면 TGrid 가 지원하는 Worker Protocol 이 필요하고,
마찬가지로 TGrid 에서 지원하는 Remote Function Call 과 Remote Critical Section 이란 개념이 필요함
도커나 쿠버네티스로 블루그린 배포방식 자주쓰지않음?
새로운 서버 띄우고 커넥션 바꿔주고
도커랑 이거랑은 별 상관없지. NodeJS 로 서버 만들때는 프로그램 스스로가 무중단 업데이트에 대한 대비가 있어야 하는데
ㅇㅇ 새로운 서버 띄우고 커넥션 바꿔주는건, 기존 서버에 접속해있던 사람들 리퀘스트 다 불량처리 되는거거든
https://www.google.com/amp/s/wallees.wordpress.com/2018/04/22/blue-green-%25EB%25B0%25A9%25EC%258B%259D/amp/
요거말한건뎅
그니까 블루그린도 현재 작업중인 요청은 죽는다니까욧
아 그 잠깐동안 죽는것도 아까워서?
ㅇㅇ 저거 짤방에 있는 서버는 리퀘스트 한 건 처리하는 데 소요되는 시간이 20~30초 이런 것들도 있거든. 그런거 날라가면 답 ㅇ벗음
노드는 코드 수정해서 올리기도 쉬운데 무중단이 필요있나
업데이트 순간마다 커넥션 죽어서 오류나버리면 그것도 아깝잖아
그래서 보통 앞에 nginx 달아서 하는게 원칙이다
nginx 거쳐도 현재 작업중인 커넥션이 중단되고 죽는건 변함없음
괜찮은것같음
성능에서 너무 손해보는거아님? 심지어 그냥 lock도 아니고 remote lock이면..
겨우 락 정도로 손해볼 성능은 아님
SharedTimedMutex 에서 읽기락 거는 로직도 무겁거나 그런거 전혀 없음 ㅇㅇ.
https://github.com/samchon/tstl/blob/master/src/thread/SharedTimedMutex.ts
흠 그렇구나 근데 결국 프로세스를 껐다키는건 같은거아냐? 위에서 말한 구글 방법이랑 다른게 정확히 뭐임? 시비가 아니라 이해가 안돼서
작업 중인거 날리고 컸다 킴 vs 작업 중인게 있으면 그거 끝날 때까지 기다려줌
구글방식은 작업걸린 애들이 있어도 걍 다 죽여버리고 밑에건 작업 끝날때까지 기다린다는 차이인가?
ㅇㅇ
글쿠나 잼는 방식이네.. 네가 말한 방식이랑 바교해서 그냥 심플하게 현재 처리중인 request 리스트를 추적하면서 배포 업데이트가 들어오면 타이머 걸어서 주기적으로 모든 요청이 끝났는지 체크하고 끝난경우 업데이트. 이런 방식은 어떻다고 봄?
그럼 동기화가 안 되잖아. 타이머로 검사한 순간에는 이상 없었는데 업데이트 하는 그 찰나의 순간에 요청이 있다던지 식으로
ㅇㅇ그래서 가장 먼저 윗단에다 더이상 요청을 안받겠다고 해야겠지
빨리 제작좀 현기증 나니깐 !!
아이디어 배워 갑니다
재미있어보임
본문이 추가되었네. 요청 응답을 전담하는 서버랑 실질적인 서비스를 담당하는 서버를 따로두고 핫스왑시 네트워크만 담당하는 서버는 그대로 살려두되 서비스 서버만 재가동한다 단 쓰기락만 걸고 흠..
그렇게 1:N N:N으로 확장가능한 서버를 구성한다?
이해했음 그런 방식의 무중단배포라면 님이 이야기한 tgrid가 필요하겠네 마스터 슬레이브간 상태가 필요하니.. 재미있어보임
근데 어디에선가 이거 본거같음..
전에도 올렸거든
아니면 스프링같은 기존의 안정적인 프레임워크들도 다 이런식으로 하려나?
정확하게 기억이 안남.. 스프링 진영이었는지 기억은 안나는데 remote call로 비슷한 동작기재를 보이는 애가 있었음. 방식은 거의비슷한거같음 목적은 다르고
새 라이브러리 (또는 프레임워크) 이름 추천받는다.
와 개발 존나 잘하나보다 이런걸 어캐만들지