1. Elixir, Erlang 동시성 자료를 찾다가 아래 동영상을 찾게 되었습니다.

[The Soul of Erlang and Elixir • Sasa Juric • GOTO 2019]


동시성 및 라이브 업데이트 기능을 보여줌

각 프로세스가 독립적으로 움직이기 때문에..한 쪽의 에러(CPU부하)가 다른 쪽 프로세스에 영향을 주지 않음


https://www.youtube.com/watch?v=JvBT4XBdoUE

먼저 만개 jobs을 띄워줍니다.

의도적으로 두가지 오류를 만들어 내는데

1) 특정 숫자의 합을 더하는 함수를 의도적으로 반복함수로 구현

2) 13을 넣으면 "Error" 발생

3) -1을 넣으면 무한 반복 --> Scheduler usage, CPU 사용률이 97~100% 사이로 올라갑니다.

이 오류(100% cpu 사용)를 확인하여 버그를 없애는 절차를 보여줍니다.

1) Remote에서 해당 node로 접근합니다.

2) erlang 내부함수를 이용해 CPU 점유율이 높은 프로세스ID를 찾아냅니다.

3) 해당 프로세스ID 스택트레이스를 통해 어떤 file에서 문제가 되는지 확인해 봅니다.

4) 의도적으로 잘못된 코딩 부분입니다. SUM 모듈과 input string 오류부분을 수정합니다.

오류소스

수정소스

input validation 처리

 

5) 테스트를 통해, mix system.upgrade를 합니다.

테스트 후 라이브 업데이트

6) 모든 오류들이 해결되었습니다.

2. Elixir, Erlang 의 문제 해결에 대한 의견

오류 수정전에 cpu가 100%를 넘게되면 시스템이 다운되거나, 속도가 느려져서 다른 사용자는 시스템을 사용할 수 없습니다. erlang에서는 BEAM이라는 가상 환경에서 각각의 Process가 독립적으로 움직이기에 이렇게 문제를 해결할 수 있다고 합니다.


코드가 잘못되어 오류가 있는데..

이걸 실시간으로 고칠 수 있다는 걸 시연함.


또한 오류를 수정하는 것도 실시간 업데이트를 통해서 운영중인 서비스를 업데이트하여 문제를 해결합니다.

물론 데모로 보여준것이기에, 100% 가능한지는 여러 검토사항이 있겠지만...라이브업데이트를 통해 서비스를 무중단으로 사용할 수 있다는 것을 보여준 걸로도 대단히 훌륭합니다.

아래 부분이 해당 소스인데.. 빌드된 beam 모듈을 대상 node로 복사 후 대상 node에서 reload를 시킨것으로 보입니다.

3. Sasa 는 아예 아래와 같이 Erlang으로 모든 서버의 복잡도를 없앨 수 있다고 얘기할 정도입니다.

하지만 2019년 당시는 아직 프로덕션 레벨로는 쓰지 못하고 있다고 얘기함.

4. 실행되나요?

구현버전이 낮아서 맥 High Sierra 에서 실행가능함,


실행되나요?

소스코드 받아서 실행해보니 진짜로 된다.


마이너스 숫자를 넣으면 계산을 안하고, validation을 하게된다. 13 도 해결 !

라이브 업데이트도 가능하다..단지 기존 연결 세션들은 초기화되는 것으로 보인다.

그건 당연한게..가상환경 자체를 Reload 시킨 것이니까

5. 물위에 떠 있는 백조의 발같은 프로그래머들을 위해서

이걸 우아하게 기존 프로세스에 가지고 있는 정보를 보존하는 것도 가능할 까?

아마 프로세스 데이터를 disk로 복제 하고..다시 살려야 할텐데..그것도 가능한지는 잘 모르겠다.

누가 댓글로 가르쳐 주세요~

+ Recent posts