簡體   English   中英

如何同時進行扇出的Akka流處理

[英]How to make fan-out akka-streams processing concurrent

我正在嘗試使用Akka流來同時處理一系列依賴流。

像這樣:

val concurrency = 2
Source(
  (1 to 5).toStream.map(i => {
    println(s"1: Emitting $i")
    i.toString
  }))
  .mapAsyncUnordered(concurrency)(s => getNextStream(s, 25))
  .mapConcat(identity)
  .mapAsyncUnordered(concurrency)(out => getNextStream(out.x, 50))
  .mapConcat(identity)
  .mapAsyncUnordered(concurrency)(out => getNextStream(out.x, 100))
  .mapConcat(identity)
  .map(x => println(s"4: Received $x after ${System.currentTimeMillis() - start}"))
  .runWith(Sink.ignore)

我的問題是它似乎沒有同時運行。 更改concurrency變量對2無效。 我懷疑mapConcat正在序列化處理過程,但不確定。

可以在這里找到問題的完整的可運行示例: https : //github.com/realrunner/akka-stream-example

目前,該代碼需要11秒鍾才能完成。 我可以使用原始Actor輕松將其削減,而無需適當處理背壓。 關於如何使其更加並發的任何想法?

這些getNextStream調用中的每一個都出去,對單個(ton)演員使用ask 請記住,參與者以串行方式處理傳入的消息。

現在,在處理消息時,您可以使用Thread.sleep阻止actor。 通常在Akka中不建議使用阻塞-請參閱文檔的這一部分。

根據角色的實際行為,您可以使用after模式(請參閱docs )以非阻塞方式模擬長時間處理,或者是否確實需要阻塞-但要進行兩次,三次檢查-您可以阻塞專用調度(如解釋在這里 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM