当Spray参与一系列演员时发送回复

时间:2014-10-25 04:34:58

标签: scala rest akka actor spray

我在Spray中实现了一个REST端点。

以下是流程以及负责以下每个步骤的角色的名称。

  1. 调用REST API并传递所需的参数(ActorSupervisor)
  2. 验证参数(ValidateActor)
  3. 调用外部数据存储区以根据参数值获取数据(DataStoreActor) 3A。外部数据存储区API返回Future
  4. 在步骤3a中传递Future。到可以处理数据的actor(ProcessingActor)
  5. 将处理结果返回给客户端(作为Future [HTTP Response])
  6. 最昂贵的步骤是#4(可能需要400毫秒到5分钟,具体取决于输入数据集的大小。

    我的问题是如何从#5返回HTTP响应?

1 个答案:

答案 0 :(得分:1)

有多种方法可以处理您可以使用的方法,这些方法适合您的架构。使用任何方法,您将必须使用ctx(spray' RequestContext)完整方法来完成HTTP请求。您可以使用: -

  1. Pass" ctx" (spray的RequestContext)封装在Actor的消息中,并利用步骤#5中的ctx来完成请求。 例如:- 如果当前,您将message从ActorStep1传递到ActorStep2,那么您需要传递message(ctx) 在这种方法中。此方法的好处是您可以从任何步骤完成请求,但会为每条消息添加额外的属性。
  2. 您可以使用telling模式代替ask。在步骤5中,您将使用Future[ HTTP Response]在步骤4中回复Actor。类似地,步骤4中的Actor将在步骤3中响应Actor,依此类推。这对我有用,因为我只有一条链,可能不适合你。
  3. 您可以使用forward模式。例如 - 步骤1中的Actor将在步骤2中将消息传递给Actor。步骤2中的Actor将forward在处理之后将消息发送到步骤3中的Actor,依此类推,直到步骤5中的Actor。 5将使用sender ! Future[HTTPResponse]回复,{{1}}实际上会在步骤1中将消息发送给Actor,您可以在其中完成请求。
  4. Spray只是Akka上面的一个薄层,将此视为从子actor传递消息回到父Actor的情况。