2009-09-01 5 views
3

일부 저장소를 래핑하기 위해 시스템에서 액터를 사용하려고합니다 (데이터베이스 일 수도 있고 메모리 내 콜렉션 일 수도 있음). 내가 이것을하고 싶은 이유는 저장소에 대한 호출을 호출하는 코드에서 차단하려는 것이 아니기 때문에 많은 양의 메시지를 전달하려고하기 때문입니다.액터 큐의 최대 크기는?

액터의 인바운드 메시지 큐가 수십만 개의 메시지를 처리 ​​할 수 ​​있습니까? 객체의 메소드를 직접 호출하는 코드와 중간에 대기열이있는 액터를 배치하는 코드 사이의 성능 차이는 무엇입니까?

건배

답변

4

배우 사서함은 변경 가능한 이중 연결리스트로 구현 된 디큐이다. 크기는 사용 가능한 메모리에 의해서만 제한됩니다. 액터가 처리 할 수있는 것보다 더 많은 메시지를 너무 많이 보내면 OutOfMemoryError가 수신됩니다.

액터에게 메시지를 보내면 메소드가 호출됩니다. 메시지를 큐에 넣고, 액터에 알려주고, 액터에 스레드를 할당하는 것과 관련된 오버 헤드가 있습니다. 따라서 메시지를 보낼 때 많은 일들이 발생하므로 평범한 구형 동기 메서드 호출과 비교할 때 상당히 많은 오버 헤드가 발생합니다. 물론 메서드가 거기에 앉아 잠시 동안 블록하면 적어도 벽 시간만큼 느려지 게됩니다.