JMS 대신 Scala의 액터를 선호하는 디자인 결정은 무엇입니까?


81

JMS 대신 Scala Actor를 사용하는 차이점은 무엇입니까?

예를 들어 성능 및 확장 성 관점에서 Scala Actor 모델은 JMS와 비교하여 무엇을 추가합니까? 어떤 경우에 JMS보다 액터를 사용하는 것이 더 합리적입니까? 즉, JMS가 처리 할 수없는 액터가 다루는 문제는 무엇입니까?

답변:


112

JMS와 Scala 액터는 이론상 유사성을 공유하지만 반드시 동일한 문제를 구조적으로 해결한다고 생각하지는 않습니다. 액터는 레이스와 교착 상태가 일반적으로 실수로 생성하기가 더 어려운 공유 메모리 동시성에 대한 가벼운 대안입니다. JMS는 직접 메시징, 게시 / 구독, 트랜잭션, EJB 통합 등을 포괄하는 정교한 API입니다.

행위자에 해당하는 가장 가까운 JMS는 비 영구적이고 트랜잭션이없는 비공개 / 구독 큐에 의해 지원되는 메시지 구동 Bean입니다. 이것을 "단순 JMS 빈"이라고 부를 것입니다.

이제 귀하의 질문에.

JMS는 구현이 아니라 사양이기 때문에 성능은 이야기하기 어렵습니다. 그럼에도 불구하고 간단한 JMS bean을 사용할 때 성능이 시간과 메모리 측면에서 액터에 대한 약간의 우위와 함께 대략 비슷할 것으로 기대합니다. pub / sub, 트랜잭션 등과 같은 기능을 JMS에 추가하면 성능이 자연스럽게 더 저하되지만 사과와 오렌지를 비교하려고합니다.

확장성에 관해서는 간단한 JMS bean은 액터와 거의 동일한 방식으로 확장되어야합니다. JMS 믹스에 트랜잭션을 추가하면 트랜잭션 범위에 따라 자연스럽게 확장 성이 저하됩니다.

JMS가 할 수없는 행위자가 무엇을 하는가에 대한 더 광범위한 질문. 음, 내장 된 pub sub 또는 트랜잭션이 없으면 행위자가 JMS에서 빼는 것처럼 보일 것입니다. 대체로 그것은 사실입니다. 하지만 여기에 문제가 있습니다. 액터는 매우 작은 코드를 필요로하기 때문에 매우 미세한 동시성을 위해 기꺼이 사용할 수 있습니다. 일반적인 자바 코드에서는 "JMS와 그 종속성 또는 필요한 코드 등을 망쳐 놓고 싶지 않아서 스레드를 생성하고 잠금을 사용하고 데이터 구조를 공유 할 것입니다."라고 말할 수 있습니다. 스칼라 배우들과 함께 저는 "배우를 채찍질하고 넘어가겠습니다"라고 말할 가능성이 훨씬 더 높습니다.

디자인에도 철학적 차이가 있습니다. 액터는 수퍼바이저 계층 구조의 단순하고 내장 된 개념을 가지고 있습니다. 액터는 일반적으로 "let it crash"디자인에 사용됩니다. 어떤 이유로 배우가 죽으면 다른 배우가 그 배우를 다시 시작하고, 여러 배우를 죽이고 모두를 다시 시작하거나, 다른 배우가 할 수 있도록 여러 배우와 자신을 죽이는 등 어떻게해야할지 결정할 책임이 있습니다. 문제를 처리하십시오. 이런 종류의 것은 JMS에 추가 할 수 있지만 API의 핵심이 아니므로 어떻게 든 외부에서 관리해야합니다.

그건 그렇고, JMS가 다루는 영역으로 더 많이 이동하는 Scala 액터 라이브러리에 대해서는 Akka를 참조하십시오 . Akka는 또한 많은 일반적인 행위자 계층 전략에 선언적 접근 방식을 제공합니다.


나는 그것을 다루었다고 생각한다. 이를 명확히하기 위해 마지막 몇 단락을 업데이트했으며 액터 계층에 대해서도 약간 설명했습니다.
James Iry 2011 년

2
크리스티안, 정확하지는 않습니다. Akka 액터는 일반적으로 Scala 액터보다 가볍습니다. 그러나 API 및 구성 설정은 약간 더 복잡합니다. 지연 / 처리량이 문제가되지 않는 경우 (예 : 작업자 작업 생성) Scala 액터를 사용하고, 해당되는 경우 또는 감독이 필요한 경우 Akka 액터를 사용합니다.
Alexander Temerev 2011

8
일반적으로 JMS 구현에는 Akka / Actors가 외부 브로커없이 실행될 수있는 외부 브로커가 필요하다는 점도 주목할 가치가 있습니다. 물론 프로세스 / 호스트 간 메시징을 원한다면 적절하게 선택할 수 있습니다.
jasonk 2013 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.