본문 바로가기
Server

12. 유저 세션(1)

by Doromi 2018. 1. 15.
728x90
반응형

6-1. 유저 세션

 

서버에서 세션은 유저가 접속한 이후에 로그인된 상태에 지속적으로 관리하기 위해 필요하다.

모바일에서는 로그인과 다르게 로그아웃은 서버에서 자동으로 관리해줘야 한다.

로그인에 성공한 유저의 세션을 만들고, 해당 유저가 특정한 시간 동안 아무런 행동을 하지 않는다면 자동으로

세션을 종료해서 로그아웃 되도록 하는 기능이 필요하다.

 

사용자의 행동과 서비스에 맞는 적절한 시간을 이용해서 세션의 만료를 판단해야 한다.

 

얼랭 프로세스를 이용해서 유저의 세션을 만들 거다.

유저의 세션이라고 하는 것은 접속한 유저마다 독립적으로 하나씩 필요한 것이고, 이것에 가장 잘 부합되는 것이

얼랭의 프로세스이다.

 

6-1-1. 얼랭 프로세스

 

얼랭에서의 프로세스라고 하는 것은 OS의 프로세스를 생각하면 안 된다.

얼랭의 프로세스는 얼랭 시스템 내부의 자체적인 프로세스이다.

얼랭을 실행시킨 것만으로도 얼랭 프로세스를 생성한 것이다.

 

얼랭에서 이루어지는 모든 연산은 프로세스 안에서 이루어진다.

프로세스 밖에서 실행되는 것은 없다.

 

얼랭 프로세스는 각각 고유한 값인 Pid(process identifier)를 가지고 있다.

자신의 Pid를 확인하는 함수는 self()이다.

 

 

 

<A,B,C> A부분의 숫자는 얼랭 node를 구분하는 고유 번호로 로컬 프로세스의 경우에는 0

B 부분의 숫자는 프로세스의 인덱스 번호

C 부분은 프로세스 인덱스 번호가 최대값을 넘어가면 하나씩 증가

 

직접 입력해야 할 경우에는 pid(0,59,0) 이렇게 해야 한다.

 

그 밖에 현재 얼랭 시스템에서 동작중인 다른 프로세스들을 확인하고 싶을때 i()함수를 실행한다.

 

i()를 실행해보면 엄청난 숫자의 프로세스가 동작하고 있는데 그동안 mnesia 같은 다양한 얼랭 어플리케이션 모듈을

실행시켰기 때문이다.

 

특정 프로세스의 정보를 자세히 확인하는 방법은 erlang:process_info(Pid) 함수를 사용하면 된다.

 

 

links 부분을 보면 <0.56.0>이라는 프로세스와 link된 상태임을

알 수 있다.

프로세스가 죽으면 exit 정보를 link된 프로세스에서 시그널 혹은

메시지로 전달하게 된다.

여기서는 <0.56.0>으로 전달한다는 것을 알 수 있다.

 

 

 

 

 

 

현재 얼랭 시스템에 떠있는 모든 프로세스의 개수를 파악하려면 erlang:system_info(process_count) 함수 사용한다.

시스템의 최대 프로세스 개수 설정을 가져오려면 erlang:system_info(process_limit) 함수를 사용한다.

최대 프로세스 개수는 얼랭 실행시 +p 옵션으로 원하는 대로 설정할 수 있다.

 

6-1-2. 프로세스 내부 구조

 

얼랭 프로세스는 경량 프로세스이다.

OS의 프로세스가 아닌, 얼랭 VM 내부에 존재하는 메모리 영역일 뿐이다.

각각의 프로세스는 크게 4가지로 구분되는 메모리 영역을 가지고 있다.

PCB, Mailbox, STACK, HEAP

 

Mailbox - Message Queue로 다른 프로세스에서 전달받은 메시지가 쌓이게 된다.

 

6-1-3. 프로세스 생성

 

우리는 서버에 로그인하는 유저 한명당 하나의 프로세스를 생성할 것이다.

수만 명이 접속하면 수만 개의 프로세스가 생성되도록 할 것이다.

 

프로세스를 생성하는 함수는 spawn BIF이다.

 

spawn(Module, Function, Arguments)

 

spawn을 실행하면 해당 프로세스에서 새로운 프로세스를 Module:Function(Arguments)를 실행하여 생성한다.

spawn(function()) 이런 식으로 함수 자체를 입력해도 된다.

함수를 변수로 정의하는 방법은 fun() -> 내용 end. 형식을 사용하면 된다.

 

6-1-4. 메시지 전달 및 받기

 

프로세스는 서로에 대해 완벽하게 독립적이다.

OS에서 프로세스들이 각각 독립적으로 동작하듯이 얼랭 프로세스도 서로 공유하는 것은 아무것도 없다.

특정 프로세스가 죽었다고 해서 얼랭 시스템이 죽거나 하는 일은 발생하지 않는다.

 

그러면 프로세스들 사이에는 어떻게 통신을 할까?

3장에서 설명한 대로 서로간에 메시지를 교환하여 정보를 주고 받는다.

프로세스들 사이에 뭔가를 전달하고 받으려면 메시지를 사용한다,

특정 Pid의 프로세스로 메세지를 전달하는 방법은 Pid ! Message

Pid를 적고 느낌표 다음에 메시지 내용을 적으면 된다.

 

f()를 실행해서 지금까지 얼랭 쉘에서 사용했던 변수들을 초기화한 뒤에 자신에게 hi라는 메시지를 보내고,

flush()를 실행해서 도착한 모든 메시지를 출력하도록 한다.

 

프로세스에 도착한 메시지는 mailbox에 저장된다.

observer:start()를 실행해서 observer tool을 이용해 Process 탭에 나의 얼랭 쉘에서 표시된 Pid를 찾아보겠다.

 

 

 

창을 띄워놓은 상태에서

 

 

메시지를 보낸 뒤 프로세스 정보 창에서 Ctrl+R을 눌러서 Refresh하면 다음과 같이 2로 변한다.

아직 처리되지 않은 메시지가 2개가 있는 것이다.

상단에 Message 탭을 클릭하면 어떤 메시지가 있는지 확인할 수 있다.

 

 

flush()를 실행해서 메시지를 모두 가져오면, Message Queue()의 크기가 다시 0이 될 것이다.

 

 

728x90
반응형

'Server' 카테고리의 다른 글

14. 유저 세션(3)  (0) 2018.01.18
13. 유저 세션(2)  (0) 2018.01.15
11. 데이터베이스(2)  (0) 2018.01.13
10. 데이터베이스(1)  (0) 2018.01.12
9. 로그인(3)  (0) 2018.01.11