【问题标题】:Naming conventions for Akka messages and actorsAkka 消息和参与者的命名约定
【发布时间】:2014-07-29 02:37:13
【问题描述】:

我目前正在制作一个相当大的基于 Akka 的 Java 应用程序,但我遇到了几个问题,这些问题一直困扰着我。

我当前的包布局有点像这样:

我的Mobile 班级担任actors 包内演员的主管。

由于我不想为每个HttpClientAccount 创建一组新的Actor,我将它们传递到消息对象中,这些对象存储在消息包中,以及端点ActorRef收到最终结果。然而,这确实会创建一个非常混乱的 messages 包,其中每个参与者都有不同的消息。例如。 MobileForActor1Actor1ForMobileMobileForActor2 等等。现在我的问题是,是否有一个约定用于处理这个问题的这类东西,并且是我的结构(Mobile->Actor1->@ 987654333@->Actor2-> 等)Akka 想要的方式还是我必须将消息排序(Mobile->Actor1->Actor2-> 等)?

现在我正在向我的Mobile 演员发送ConnectMessage,然后将其发送给Actor1Actor1 处理它并将新消息发送回MobileMobile 发送该响应然后到Actor2,循环继续,新消息基于旧消息创建。例如。 new Message2(message1.foo, message1.bar, message1.baz, newComputatedResult, newComputatedResult2, etc);

这是一种好的做法,还是我应该包含旧实例(其中可能包含不再有用的信息)并包含新内容?例如。 new Message2(message1, newComputatedResult, newComputatedResult2, etc);

或者我应该做一些完全不同的事情吗?

我考虑过使用 TypedActors,但那些需要使用瀑布模式,我不知道如何传递想要接收最终结果的侦听器的 ActorRef。

我希望我让自己足够理解,因为英语不是我的处女语言,而且每个人都清楚这个问题。

我是 Akka 开发人员,我喜欢这个想法,但由于文档没有很好地涵盖这一点,我认为这将是最好的提问地点。谢谢阅读!

【问题讨论】:

    标签: java akka


    【解决方案1】:

    我将冒险尝试几个 cmet 来回应这个问题,因为我在 Akka 的学习曲线中处理了相同的问题。我想你是在要求一些经验法则,所以我的包含在这里。

    首先,创建演员非常便宜;它们非常轻巧。那么,为什么不为每个 HttpClient 和 Account 创建一个,并根据他们的身份给他们取合适的名字呢?这也避免了您不得不尽可能多地传递它们,可能会破坏您的代码。

    其次,让您的消息名称简短、重点突出并以动词开头。每条消息都应该告诉演员做某事,因此您希望名称通过使用动词来反映这一点。

    第三,消息集与演员一起出现。我通常在actor类的伴生对象中声明它们,这样使用它们就像ActorClass.MessageName,除非它在ActorClass内,然后它只是MessageName

    第四,在演员的名字后面加上一个计数器。我经常只是将一个计数器(使用AtomicInteger)与类型的名称(Car-1Car-2 等)结合起来。

    如果层次结构对您很重要,我建议只将父演员附加到名称中。类似Phone-1-in-Car-7 的意思是Phone-1 包含在Car-7 中。然后,您可以按照父链接以编程方式和手动方式组装层次结构。

    我认为ConnectMessage 中的“消息”是多余的。只需将消息名称设置为“Connect”或更好的“ConnectToThing”(无论 Thing 是什么,如果相关的话)。

    我不会像您建议的Message2 那样将您的消息名称复杂化。使用最少的信息对阅读这些名称的人有用。我认为您的这部分问题可能导致对此缺乏回应。我发现它很混乱,因为缺少很多细节。

    希望这会有所帮助。

    【讨论】:

    • 你能举一些好的消息命名的例子吗?例如,我有一个供应商和消费者。消费者想询问供应商它有多少商品。您如何命名请求和响应的消息?
    • @TemaBolshakov - "GetGoodsCountRequest" 和 "GetGoodsCountResponse" 怎么样?
    • 不确定这些名称在 scala 中是否足够惯用。我喜欢第一个,但后者看起来有点多余。用 Int 回应会更好吗?或者为 Int 定义类型别名,例如type GoodsCount = Int。 scala 中的最佳选择是什么?
    • 对于消息类型,我对请求使用后缀“Request”,对回复使用“Result”,对不触发回复的执行使用“Op”。例如:createRequestcreateReplyendConnectionOp
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2018-04-22
    相关资源
    最近更新 更多