erlang을 이용한 swap 서버
DESCRIPTION
TRANSCRIPT
erlang swap 서버 만들기윤재진
오늘 다루는 주제
erlang 소개
기본문법
기본 Fun 생성 방법
간단한 분산 콜 방법
간단한 동시성 처리 방법
다루지 않는 것들
application 으로 만드는 방법
OTP
죽지않는 서버 suporvisor 서버 만들기
erlang 이란 ?
erlang 의 발음은 얼랭
erlang 을 만든 사람은 Joe Amstrong
Ericsson 사에서 스위칭 소프트웨어에서 사용하기 위해 개발
80 년대에는 전화국 스위칭 시스템에 무정지 작동 시스템으로 돌아감
1998 년 오픈소스 전환됨
OTP(Open Telecom Platform) 이란 기본적인 통신관련 견고한 프레임워크 제공함
erlang 의 특징
Pure Functional Program Language
모든 값들은 상수이다 .
= 이란 부등식이다 .
분산환경을 기반으로 언어가 설계되어 있다 .
ETS
erlang 에서 기본적으로 제공하는 key-value 테이블 제공
DETS
erlang 에서 ETS 을 분산적으로 처리하는 것
erlang 에 사용된 대표적인 오픈소스
Riak
RabbitMQ
MochiWeb
CouchDB
erlang type
atom
소문자로 된 문자열
enum 과 비슷하지만 숫서나 이런게 없이 그냥 문자열 그 자체
a, true, hello...
변수 ( 상수 )
대문자로 시작하는 문자열
A = 1, This = 3, L = [1,2,3], Tuple={1,2,3}, Str =”String”
튜플
c 의 구조체와 비슷하지만 익명이 다른
P = {10,45}.
Person = {person, {name, joe}, {height, 1.82}}.
List
일반적인 fp 랭귀지의 리스트와 통일함 .
java 에서 사용한 리스트랑은 다름 .
L = [1,2,3]
ㅇㅇ
erlanng type
문자열 (String)
java 에서 사용한 문자열과 통일하게 사용함
다른점은 문자열도 list 임
[97,98,99] = “abc”
패턴매칭얼랭은 모든 변수가 상수이기 때문에 패턴매칭이 매우 중요함 .
= 이란 대입이 아닌 부등식에서 출발함 .
[A,B,C] = “abc”.
A == 97.
Person = {person , {name, jaejin}}.
{_,{_,Name}} = Person.
Name == jaejin.
[Head|Tail] = [1,2,3,4].
Head == 1, Tail == [2,3,4]
가드가드 예제
f(X,Y) when is_integer(X), X>Y -> X+Y;
f(X,Y) -> X.
True 가드
if
Guard-> Expressions;
Guard-> Expressions;
...
end
case 와 if 식
case 식
case Expression of
Pattern1 [when Guard1] -> Expr_seq1;
..
end
if 식
if
Guard1 -> Expr_seq;
...
end
예외try..catch 로 자바와 비슷함
try Expression of
Pattern1 -> Expression1;
...
catch
ExceptionType : ExPattern1 -> ExPression;
after
AfterExpressions
end
구두점
,
and 표현됨 .
한 함수에서 여러줄을 처리할때는 사용 .
;
함수를 여러절로 나눌때 사용
수학에서 표현하는 방식과 동일
.
식이나 함수 등이 끝나는걸 표시
함수사용자 함수 만드는 방법
fibo(0) -> 1;
fibo(1)->1;
fib(N)->fibo(N) + fibo(N).
arity
그 함수가 가지는 인수의 수
위의 fibo 함수의 arity 는 1
표시 방법은 fibo/1
자바에서 오버로우딩이 여기에서 기본적으로 사용함
sum(L) -> sum(L,0).
sum([],N) -> N;
sum([H|T], N) -> sum(T, H+N).
익명의 함수
Z = fun(X) -> 2*x end.
lists:foldl(fun(X,Sum)->X+Sum end, [1,2,3,4]).
퀵정렬
qsort([]) -> [];
qsort([Pivot|T]) ->
qsort([X || X <- T, X <- Pivot])
++ [Pivot] ++
qsort([X || X <- T, X >= Pivot]).
모듈
파일명이 모듈명
-module( 파일명 ).
모듈 밖에서 함수 호출하게 할려면
-export([ 함수명 /arity,...]).
병행성Pid = spwan(Fun)
Fun 을 평하가흔 병행 프로세스 생성
Pid ! Message
식별자가 Pid 인 프로세스 메시지 보내기
receive ... end
프로세스로 전송된 메시지를 받는다 .
얼랭에선 일반적인 스레드 방식으로 병행성을 처리 하지 않는다 .
얼랭에선 client - server 로 메시지를 주고 받아서 병행성을 처리 한다 .
프로세스 등록 및 전달방법
register(hello, spwan(fun area_server:loop/0)).
hello ! {hello, “hello”}
간단한 분산처리
동일한 호스트에서 하나는 클라이언트 , 다른 하나는 서버 .
swap 예제 README.md 에 예제 있음 .
실행방법
erl -sname 노드이름
동일 LAN 상에서 서로 다른 머신에 있는 클라이언트 서버
erl -name 노드이름 -setcookie 쿠키명
erl -sname 노드이름 @host -setcookie 쿠키명’
host 명은 DNS 가 아닌 동일 LAN 상이라서 /etc/hosts 에 등록해야함
서로다른 서버에서 쿠기명을 동일하게 해야함
swap 서버 예제
https://github.com/jaejin/swap_server_example
앞으로 ...
프론트를 단순한 소켓으로 했지만 mochiweb 과 같은 웹애플리케션으로 하는 방법
프론트를 쓰리트나 mochiweb 연결체로 두고 erlang 에서는 죽지않게 비즈니스만 교체할 수 있도록 하는것 괜찮을꺼 같음
추가적인 정보들
빌드툴
rebar : maven 과 비슷한 프로그램
Editor
Emacs + Erlang.el + flymake
Q & A
참고문헌
프로그래밍 얼랭 , 저 : 조 암스트롱 , Insight