【发布时间】:2020-07-13 04:09:26
【问题描述】:
我正在使用 akka/scala/play 堆栈。
通常,我使用流来执行某些任务。例如,我有一个每分钟唤醒一次的流,从数据库中获取一些内容,然后调用另一个服务来使用 API 丰富其数据并将丰富的内容保存到数据库中。
类似这样的:
class FetcherAndSaveStream @Inject()(fetcherAndSaveGraph: FetcherAndSaveGraph, dbElementsSource: DbElementsSource)
(implicit val mat: Materializer,
implicit val exec: ExecutionContext) extends LazyLogging {
def graph[M1, M2](source: Source[BDElement, M1],
sink: Sink[BDElement, M2],
switch: SharedKillSwitch): RunnableGraph[(M1, M2)] = {
val fetchAndSaveDataFromExternalService: Flow[BDElement, BDElement, NotUsed] =
fetcherAndSaveGraph.fetchEndSaveEnrichment
source.viaMat(switch.flow)(Keep.left)
.via(fetchAndSaveDataFromExternalService)
.toMat(sink)(Keep.both).withAttributes(supervisionStrategy(resumingDecider))
}
def runGraph(switchSharedKill: SharedKillSwitch): (NotUsed, Future[Done]) = {
logger.info("FetcherAndSaveStream is now running")
graph(dbElementsSource.dbElements(), Sink.ignore, switchSharedKill).run()
}
}
我想知道,这是否比只使用一个每分钟都在滴答作响的演员做类似的事情更好?为此使用演员和流之间的比较是什么?
试图弄清楚我什么时候应该选择哪种方法(流/演员)。谢谢!!
【问题讨论】:
-
如果您不需要在 actor 中存储任何状态,我更喜欢使用 akka 流方法。 Actors 用于状态,而不是用于并发,请参阅 chrisstucchio.com/blog/2013/actors_vs_futures.html
标签: scala playframework akka actor akka-stream