我正在使用akka / scala / play堆栈。
通常,我使用流来执行某些任务。例如,我有一个流,它每分钟都会醒来,从数据库中拾取一些东西,然后调用另一个服务以使用API丰富其数据并将丰富的内容保存到DB。
类似这样:
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 / scala / play堆栈。通常,即时消息使用流来执行某些任务。例如,我有一个流,它每分钟都会醒来,从数据库中拾取某些东西,然后调用另一个...
您可以同时使用这两种方法,具体取决于此处未列出的解决方案要求。您需要考虑的一般问题-角色比流更底层的角色,因此他们需要更多的代码和调试。