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

Erlang을 이용한 swap 서버

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