2010-01-28 5 views
13

나는 erlang 서버를 구축 중입니다. 사용자가 HTTP 요청을 서버로 보내 상태를 업데이트합니다. 서버의 http 요청 프로세스는 사용자 상태 메시지를 메모리에 저장합니다. 1 분마다 서버는 모든 메시지를 원격 서버로 보내고 메모리를 지 웁니다. 사용자가 1 분 내에 여러 번 상태를 업데이트하면 마지막 메시지가 이전 메시지보다 우선합니다. 모든 메시지를 읽고 다른 프로세스를 지우는 사이에 상태 메시지를 쓸 수 있어야합니다.dict 대 mnesia 테이블이있는 gen_server

구현하는 가장 좋은 방법은 무엇입니까?

  1. dict이있는 gen_server. 키는 userid가됩니다. dict : store/3은 상태를 갱신하거나 작성합니다. gen_server는 '트랜잭션'문제를 해결합니다.

  2. mnesia table with ram_copies. 거래를 처리하고 gen_server를 구현할 필요가 없습니다. 이 솔루션에 오버 헤드가 너무 많습니까?

  3. 가벼운 무게와 gen_server가있는 ETS 테이블. ETS에서 거래를 할 수 있습니까? 모든 메시지를 읽거나 지우는 사이에 테이블을 잠 그려면? 당신이 수동으로 동기화 않기 때문에

감사

+1

이는 얼랑 - 질문 메일 링리스트에서 논의되고있다. – rvirding

+5

그리고 여기에 stackoverflow를 처음 발견 한 저 같은 사람들을위한 토론 링크가 있습니다 : http://erlang.2086793.n4.nabble.com/gen-server-with-a-dict-vs-mnesia-table-vs- ets-td2119064.html – JoelPM

답변

18

는 mnesia 훨씬이다. 네트웍을 필요로하지 않는다. 넷과 기억 상실의 주요 차이점이다.

Ets는 제가 동의하는 한 dict/bag/...에 대한 otp 호환 프로세스이며, 데이터에 액세스하는 프로세스가 여러 개이므로 ets를 사용해야합니다.

나는 나 자신을 위해 다음과 같은 논리를 내놓았다 :

Multiple processes on multiple VMs -> mnesia 
Multiple processes on one VM -> ets/dets 
One process -> bag/dict/...