請注意,以下描述僅用於說明目的。問題是關於akka中事件流處理的模式,而不是關於如何用替代設計來解釋說明性示例的問題。當路易斯想要更改路由時,Akka路由演員
想象一下,在Akka中編寫的複雜事件處理引擎,其中事件規則由參與者建模。消息的事件流與訂單類似,訂單中的物品履行,訂單付款。業務規則參與者正在做類似的事情,即向客戶開具發票並跟蹤付款,直至完成。業務規則感興趣的數據本質上是非常動態的,因爲不可能知道哪些規則正在跟蹤消息流的哪些部分。
天真地可以使用boardcast路由器風格的方法。所有業務規則參與者都會看到所有數據,如果它們不是跟蹤數據,他們會忽略該消息。然而,這會產生可擴展性問題,因爲並非所有規則參與者都對所有數據感興趣的比例非常高。這意味着使用一個索引,其中規則actor通過消息中的複雜業務標識符來跟蹤哪些類型的消息。那麼我們只能向規則演員發送他們正在尋找的數據。這個消息的索引指向哪些參與者響應演員中的業務規則而改變。從路由參與者的角度來看,這個路由器想要動態地改變路由。
這會引起計時問題。如果路由參與者的運行速度足夠快,以保持許多路由器忙碌,那麼它將傳遞消息流,例如{A,B,C},直到某個特定路由器獲得消息{A}。如果那個被告人決定它需要消息{B},那麼它將已經被路由到它的上游,但是不會被路由到最近發現它現在想要消息{B}看到消息{A}的被告的郵箱。修改後的路由只會在{C}之後的消息中生效,或者當路由參與者處理來自特定的路由器的響應消息時可能會更晚。
解決此問題的一個辦法是緩存路由參與者的消息。然後,如果一個路由器改變了它對響應消息的興趣,那麼路由參與者可以掃描舊消息的緩衝區並根據需要重新發送一些消息。這意味着需要很多代碼來保持消息的緩衝區儘可能小,以便能夠儘可能高效地重發它們。我想知道是否有更標準的模式或更自然的方法來解決阿卡內的動態路由問題?
[腳註:在註釋中描述的替代解決方案是使用消息緩存並讓規則參與者擊中緩存,但讓我們假設緩存將非常大,迫使IO或主階段jdbc存儲所以假設緩存不可取,如果可以避免的話。問題是關於akka中的事件流模式,其中路由規則可以以高度動態的方式改變 - 上述系統的近似描述被簡化並且僅用於說明目的。關鍵的參數是關於消息流{A,B,C}並且具有路由讀取{A}決定它然後需要已經由上游路由器調度的消息{B}。]
問題是否每個要處理的事件/消息都有一個ID並且您的應用程序可以明確說出我有消息ID = A我需要消息ID = B嗎?根據您當前的設計,或許您有一個聚合器,它可以維護一個ID列表並知道潛在的副作用,並在需要時將消息轉發給其他參與者。另一種選擇是嘗試儘可能多地分組您的管道線,這樣您就可以向最少數量的參與者進行廣播,並且演員鏈會自行決定接下來發送消息的位置。 – NightWolf
@NowWolf新的akka軟件是一個聚合器,它的工作是制定業務規則來確定哪些消息是相關的,並根據這些消息採取行動。因此,在將問題發送給規則參與者之前,無法簡化該問題以瞭解哪些消息是相關的。事件的峯值爆發量將非常高,因此需要扇出管道。路由參與者應該掌握哪些規則通過消息的哪些業務密鑰跟蹤哪些消息的索引。那麼挑戰就像問題中所概括的那樣:如何有效地讓路線更新那個指數。 – simbo1905
林不知道我完全理解爲什麼你需要有一個路由的演員。這聽起來像RuleActorX正在決定路由狀態需要改變。對我來說這聽起來像是豐富。如果RuleActorX決定它需要更多的數據,那麼它應該通過向某個重新路由器發送消息或明確從存儲中獲取消息來請求。也許你可以使用代理來管理狀態變化,而不是緩衝看起來有風險的消息。 – NightWolf