gpt4 book ai didi

scala - Akka、Scalatra 和 Web 状态问题

转载 作者:行者123 更新时间:2023-12-04 20:47:02 25 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

2年前关闭。




Improve this question




这是一个由两部分组成的问题,首先是设计问题而不是如何实现它,其次是 Akka 的一些实现问题。

我正在使用 Scalatra 构建一个 REST 服务端点,调用该端点时将从多个源中提取图像,操作它们并返回它们。这可能是一个相当长的运行过程,并且可能比单个 http 请求/响应周期可接受的时间更长。

我对此的想法是,当进行调用时,我将启动一堆 akka Actor 来拉取图像资源,并让它们将结果交给图像处理 Actor 进行缩放等。初始请求本身会立即返回某种类型处理 ID 可用于对另一个端点进行后续轮询调用,该端点将在处理结果时返回结果,并带有一个标志以确定是否有更多可用结果让客户端知道停止轮询。

我的问题如下:

  • 从设计的角度来看,这有意义吗?
  • 如果我使用这种方法,那么每个检索处理图像的后续请求都必须具有某种状态意识才能知道客户端已经收到了哪些图像。你将如何管理这种状态?
  • 我从来没有看过这个,但是在这种情况下,长时间运行的 cometd 式 HTTP 请求是否比轮询更有意义?

  • 实现部分

    假设我最终得到了与上述类似的设计,我对 Scalatra 和 Akka(或任何 Actor 范式)非常陌生,我有几个问题。

    好的,我认为第一个是 Scala/Scalatra 特定问题。好的,我查看了 akka 上的 Scalatra 文档 http://www.scalatra.org/guides/async/akka.html ,在这个例子中,他们按如下方式设置应用程序 bootstrap :
     // Get a handle to an ActorSystem and a reference to one of your actors
    val system = ActorSystem()
    val myActor = system.actorOf(Props[MyActor])

    // In the init method, mount your servlets with references to the system
    // and/or ActorRefs, as necessary.
    override def init(context: ServletContext) {
    context.mount(new PageRetriever(system), "/*")
    context.mount(new MyActorApp(system, myActor), "/actors/*")
    }

    我假设 scalatra 的引导在应用程序启动时发生一次,那么 system.actorOf(Props[MyActor]) 是创建单个实例还是每个请求一个实例?

    其次,假设我的 MyActor 类(或更合理的名称)做了以下事情:
    class MyActor extends Actor {
    def receive = {
    //Find the [ImageSearchingActor] actor in akka registry and send search message
    case initiateSearchRequest: InitiateSearchRequestMessage => TODO

    //Find free [ImageProcessingActors] in akka registry and send each Image url to process
    case imageInformationFound : ImageInformationFoundMessage => TODO

    //Persist the result to a cache, or data store with the ProcessingId that all message will pass
    case imageProcessed : ImageProcessedMessage => TODO
    }
    }

    现在,在这种情况下,multiple 有多个地方我将检索图像,因此多个 Actor 将获取这些数据。当他们找到合适的图像时,将使用多个 Actor 来处理图像。如果我采用我的设计,那么我需要在某处标记为给定的 ProcessingId 没有更多可用的处理图像。这意味着我需要知道给定的 ProcessingId 的所有图像搜索和图像处理参与者何时完成。我该怎么做呢?

    所以这是很多问题,要消费的信息我希望它是有道理的。

    干杯。克里斯。

    最佳答案

    这里有几个问题。快速回答:

  • 是的,我想是这样。
  • 您可能希望将一个 Actor 类用作聚合器、主控器或协调器,从而启动图像检索和图像处理 Actor 类。然后,聚合器包含您的整体计算何时可以被视为完成的逻辑。互联网上有很多这种事情的例子,如果你想要具体的例子来匹配你正在做的事情,请确保你查看 Akka 2.1.x 的例子,因为如果你可能需要这就是你所需要的重新使用当前的 Scalatra 代码库。
  • 这可能是个好主意。 Scalatra 与 Atmosphere 框架集成,这使得进行 websocket/comet 长轮询变得非常容易。您可以阅读 in the docs .它对您的应用程序是否有意义取决于很多因素,但值得一看。根据我的经验,套接字编程有时会令人惊叹,有时会比它的值(value)更麻烦 - 例如,如果您正在使用大量代理,除非使用 SSL,否则 websockets 会出现问题。不过,看到信息一可用就被推送到客户端是一件很美妙的事情。

  • 对于另一个问题,关于 ActorSystem 创建:

    在 Scalatra 中,您的 Controller 是基于每个请求实例化的;示例代码中的 ActorSystem 仅初始化一次。每当有请求进来时,就会创建一个新的 Controller 实例,并引用 ActorSystem。

    ActorSystem 创建是 a heavyweight operation ,并且应该尽可能少地发生。

    关于scala - Akka、Scalatra 和 Web 状态问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15986544/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com