문제

Erlang에 제작 된 서버 응용 프로그램이 있습니다. 그것 안에는 사진에 정보를 저장하는 MNESIA 테이블이 있습니다. "모든 것이 과정입니다"라는 정신으로 나는 그 테이블을 gen_server 모듈, 그래서gen_server 모듈은 테이블에 직접 액세스하는 유일한 모듈입니다. 해당 테이블에 정보를 쿼리하고 추가하는 것은 해당 프로세스 (등록 된 이름이 있음)에 메시지를 보내면 수행됩니다. 아이디어는 해당 테이블에서 정보를 쿼리하는 여러 클라이언트 프로세스가 있다는 것입니다.

이것은 잘 작동하지만 그게 잘 작동합니다 gen_server 모듈에는 상태가 없습니다. 필요한 모든 것은 MNESIA 테이블에 저장됩니다. 그래서, 나는 A가 궁금합니다 gen_server 아마도 그 테이블을 캡슐화하기위한 최고의 모델이 아닐까요?

단순히 프로세스로 만들지 말고 대신 해당 모듈의 기능을 통해 테이블을 캡슐화해야합니까? 해당 모듈의 버그가있는 경우, 호출 프로세스가 충돌하게 될 것입니다. 이제는 단일 클라이언트에만 영향을 미치기 때문에 더 나을 수 있다고 생각합니다.gen_server 충돌을 처리하여 모든 사람이 테이블에 액세스하지 않고 두십시오 (감독자가 다시 시작할 때까지).

모든 입력은 대단히 감사합니다.

도움이 되었습니까?

해결책

나는 추측한다 Occam의 면도기 거기 있습니다 이것에 필요하지 않습니다 gen_server 존재합니다, 특히 절대적으로 있기 때문에 상태가 없습니다 그것에 저장. 이러한 프로세스는 테이블 (또는 다른 자원)에 액세스 할 필요가있는 상황에서 필요할 수 있습니다. 엄격하게 순차적 (예를 들어 ~할 것 같다 병목 현상 비용으로 중단 된 거래를 피하고 싶습니다).

테이블에 대한 액세스를 캡슐화합니다 모듈은 좋은 솔루션입니다. 그것은 생성합니다 추가 복잡성이 없습니다, 제공하는 동안 적절한 추상화 수준 및 캡슐화.

다른 팁

왜 당신이 프로세스로 테이블을 캡슐화하기로 결정했는지 잘 모르겠습니다. MNESIA는 클러스터를 통해 로컬로 분포 된 테이블에 대한 여러 동시 액세스를 중재하도록 설계되었습니다.

API 기능이 코드를 호출하는 코드에서 의도를 더 잘 전달하므로 모든 특정 테이블 액세스 작업 및 업데이트를 수행하는 API 모듈을 작성하는 것이 좋습니다. MNENSIA 작업을 호출 코드에 직접 배치하는 것보다 더 읽기 쉽습니다.

API 모듈은 또한 필요한 경우 나중에 MNESIA에서 다른 스토리지 시스템으로 전환 할 수있는 옵션을 제공합니다. API 모듈 내부의 MNESIA 거래를 사용하면 MNESIA가 충돌하는 롤백 작업으로 인해 일부 프로그래밍 오류로부터 보호됩니다. API 모듈은 항상 발신자가 사용할 수 있으며 여러 발신자가 동시에 작업을 수행 할 수있는 반면 Gen_Server 기반 API에는 프로세스가 실패하여 API를 사용할 수 없습니다.

Gen_Server 기반 API가 순수한 기능 API를 통해 제공하는 유일한 것은 테이블에 대한 액세스를 직렬화하는 것입니다. 이는 비정상적인 요구 사항이며 구체적으로 필요하지 않으면 성능 킬러가 될 것입니다.

더러운 액세스를 사용하고 거래를 피하려면 단일 Gen_Server 프로세스를 사용하여 MNENSIA 테이블을 처리하는 것이 좋습니다. 이 접근법은 TX보다 빠를 수 있지만 일반적으로 벤치마킹해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top