2014-06-08 5 views
10

저는 현재 상당히 큰 Akka 기반 Java 응용 프로그램을 만드는 중이며 끝내기 위해 몇 가지 문제가 발생했습니다.Akka 메시지 및 액터의 명명 규칙

내 현재 패키지 레이아웃은 다음과 같이 좀 같습니다

Project Structure

Mobile 클래스는 actors 패키지 안에 배우의 관리자 역할.

내가 HttpClientAccount 모든 위해 배우의 새로운 세트를 만들려하지 않기 때문에

, 나는 엔드 포인트의 최종 결과를 수신 ActorRef와 함께 메시지 패키지에 저장된 메시지 객체에 주위에있는 사람들을 전달합니다. 그러나 이것은 각 배우에 대해 서로 다른 메시지가 포함 된 매우 어수선한 messages 패키지를 만듭니다. 예 : MobileForActor1, Actor1ForMobile, MobileForActor2 등. 이제 내 질문은이 문제를 다루는이 종류의 물건을 사용하는 협약이 있으며 내 구조 ( Mobile -> Actor1 -> Mobile -> Actor2 -> 등)입니다. Akka는 그것이되고 싶어하거나 나는 단지 메시지 ( Mobile -> Actor1 -> Actor2 -> 등)의 일종의 폭포가되어야합니까?

는 지금 내가 보내고있어 내 다음 Actor1로 전송 Mobile 배우, Actor1 프로세스를 다시 Mobile에 새로운 메시지를 전송에 ConnectMessageMobileActor2에 그 응답을 전송하고주기는 새로운 메시지로 계속 이전 메시지를 기반으로 생성됩니다. 예 : new Message2(message1.foo, message1.bar, message1.baz, newComputatedResult, newComputatedResult2, etc);

이 우수 사례입니까, 아니면 이전 인스턴스 (더 이상 유용하지 않은 정보가 포함될 수 있음)를 포함시켜야하며 새로운 것을 포함해야합니까? 예 : new Message2(message1, newComputatedResult, newComputatedResult2, etc);

아니면 완전히 다른 것을해야합니까?

TypedActors를 사용하려고했지만 폭포수 패턴을 사용해야하고 최종 결과를 수신하려는 수신기의 ActorRef를 전달하는 방법을 모르겠습니다.

나는 영어가 나의 처녀 언어가 아니기 때문에 내가 충분히 이해할 수 있었으면 좋겠다. 그리고 질문은 모두에게 분명하다.

저는 처음에는 Akka 개발자 였고 아이디어가 좋았지 만 문서가 이것을 잘 설명하지 못하기 때문에 이것이 가장 좋은 곳이라고 생각했습니다. 읽어 주셔서 감사합니다!

답변

7

저는 Akka의 학습 곡선에서 같은 문제를 다루었 기 때문에 이에 대한 몇 가지 의견을 모았습니다. 제 생각에 당신은 엄지 손가락 몇 가지 규칙을 요구하고 있습니다. 그래서 여기에 제가 포함되어 있습니다.

첫째, 액터 만들기는 엄청나게 저렴합니다. 그들은 매우 가볍습니다. 그렇다면 각 HttpClient와 Account에 대해 하나를 만들고 그 신원 정보에서 파생 된 적절한 이름을 지정하는 것이 어떻습니까? 이렇게하면 코드를 넘기지 않아도 될 것입니다.

둘째, 메시지 이름을 짧고 집중적으로 사용하고 동사로 시작하십시오. 각 메시지는 배우에게 무언가를하도록 지시해야하므로 동사를 사용하여 이름을 반영하도록하고 싶습니다.

셋째, 메시지 세트가 액터와 함께 전달됩니다.나는 보통 액터 클래스의 동반자 객체에서 그들을 선언합니다. 따라서 ActorClass 내에 있고 그 후에는 단지 MessageName이 아니면 그 객체를 사용하는 것이 ActorClass.MessageName과 같습니다.

넷째, 액터의 이름에 카운터를 추가하십시오. 종종 카운터 (AtomicInteger 사용)와 유형 이름 (Car-1, Car-2 등)을 결합하기 만하면됩니다.

계층 구조가 중요한 경우 상위 액터 만 이름에 추가하는 것이 좋습니다. Phone-1을 의미하는 Phone-1-in-Car-7과 같은 문자는 Car-7에 포함되어 있습니다. 상위 링크를 따라 프로그래밍 방식으로 또는 수동으로 계층 구조를 조합 할 수 있습니다.

ConnectMessage의 "Message"가 중복되어 있다고 생각합니다. 메시지 이름을 "연결"또는 더 나은 "ConnectToThing"(해당되는 경우)으로 설정하십시오.

나는 Message2으로 제안하는 것처럼 메시지 이름을 너무 많이 합성하지 않습니다. 누구든지 그 이름을 읽는 데 유용하려면 최소한의 정보 만 사용하십시오. 이 문제에 대한 답변이 부족한 부분이 귀하의 질문에서 비롯된 것이라고 생각합니다. 많은 세부 사항이 없어서 혼란 스럽습니다.

희망이 도움이됩니다.

+0

좋은 메시지 이름 지정의 몇 가지 예를 보여 줄 수 있습니까? 예를 들어 나는 공급자와 소비자가있다. 소비자는 공급자에게 얼마나 많은 상품이 있는지 묻고 싶어합니다. 요청 및 응답을 위해 메시지의 이름을 어떻게 지정 하시겠습니까? –

+0

@TemaBolshakov - "GetGoodsCountRequest"및 "GetGoodsCountResponse"는 어떻습니까? –

+0

이 이름은 스칼라로 충분히 관용적이지 않습니다. 나는 첫 번째 것을 좋아하지만 나중에는 조금 복잡해 보입니다. Int로 응답하는 것이 더 나은가? 또는 Int의 유형 별명을 정의하십시오 (예 :'type GoodsCount = Int'). 스칼라에서 가장 좋은 옵션은 무엇입니까? –