Scala 阿克卡河。结合物化的价值。需要绘制未来地图。要使用哪个ExecutionContext/Dispatcher?

Scala 阿克卡河。结合物化的价值。需要绘制未来地图。要使用哪个ExecutionContext/Dispatcher?,scala,akka,akka-stream,Scala,Akka,Akka Stream,给定: AtoB:materializedvalue[A,B,Future[AtoBRuntimeApi]]的图形标记 BtoC:materializedvalue[B,C,Future[BtoCRuntimeApi]]的图形标记 需要:AtoC:GraphStageWithMaterializedValue[A,C,Future[AtoCRuntimeApi]] 在我的特殊情况下,在AtoBRuntimeApi和BtoARuntimeApi方面实现AtoCRuntimeApi非常方便 因此

给定:

  • AtoB:materializedvalue[A,B,Future[AtoBRuntimeApi]]的图形标记

  • BtoC:materializedvalue[B,C,Future[BtoCRuntimeApi]]的图形标记

需要:AtoC:GraphStageWithMaterializedValue[A,C,Future[AtoCRuntimeApi]]

在我的特殊情况下,在
AtoBRuntimeApi
BtoARuntimeApi
方面实现
AtoCRuntimeApi
非常方便

因此,我想将
AtoCRuntimeApi
定义为
案例类AtoCRuntimeApi(a2b:AtoBRuntimeApi,b2c:BtoCRuntimeApi)

并将新的复合阶段定义为
stageAtoB.viaMat(stageBtoC)(combineIntoAtoC)
combineintoatc:(Future[AtoBRuntimeApi],Future[B2CRuntimeApi])=>Future[AtoCRuntimeApi]

显然,
combineIntoAtoC
的实现需要一些
ExecutionContext
实例来映射未来

问题:在所描述的案例中,我应该使用什么执行上下文?

选择,我宁愿避免:

  • 在当前可用的实例中烘焙(在组成阶段时)-如果执行上下文变得不可用,“蓝图”将无法安全实现

  • ExecutionContext.global
    -嗯,它是全局的。使用它似乎大错特错(可能,每次实现一次——没什么大不了的)


最需要的执行上下文是作为materializer属性可用的上下文(
mat.executionContext
)。但我无法在联合收割机功能中访问它

在这种情况下,我通常使用actor系统上下文,这在默认情况下确实可以从物化器中引用。不过,作为一般解决方案,您可以使用隐式参数将执行上下文传递给构建流图的任何函数:

def makeGraph(...)(implicit ec: ExecutionContext): RunnableGraph = {
  def combineIntoAtoC(...) = ...  // uses ec implicitly
}
这允许您推动关于使用调用堆栈的上下文的决定。在适当的级别上,肯定会有对actor系统的调度器的某种访问


我之所以更喜欢使用actor系统的dispatcher而不是全局dispatcher,是因为它减少了依赖关系的表面-在这种情况下,所有执行上下文都来自一个源,如果需要,您知道如何配置它们。

唉,这对我来说似乎是一个有点笨拙的解决方案:如果某个组件需要一个
流[ByteString,ProtocolEvent]
,我将不得不在将流传递给组件时选择一些ExCtx。您认为使用类似于akka.dispatch.ExecutionContext.SamethreadeExecutionContext的东西有多糟糕?(类似于:
ExecutionContext.fromExecutor{command:Runnable=>command.run()}
)取决于您在组合函数中执行的操作。如果它是一个简单的元组函数,那么它可能还可以。但是,我仍然不认为将执行上下文作为隐式参数传递是有问题的,因为在基于akka和基于未来的应用程序中,您无论如何都必须这样做,并且通常可以非常容易地获得执行上下文-例如,在Actor中,可以从
context
中检索它。我发现除了a)之外,没有其他选项需要
ExecutionContext
的实例作为参数来创建
图形[Shape,Mat]
;b) 如果映射仅包含“重新设置”,则使用一种
sameThreadExecutionContext
。谢谢,非常感谢。