簡體   English   中英

如何向閑置的akka​​演員發送消息?

[英]How do I send messages to idle akka actors?

我有一個叫做TaskRunner的演員。 這些任務最多可能需要1分鍾才能運行。 由於我使用的庫,每個jvm /節點只能有一個actor。 我在各種機器上有1000個這樣的節點。

我想使用各種規則將任務分配給這些節點,但最重要的是:

  • 永遠不要在TaskRunner節點的郵箱中排隊任務,在發送任務之前總是等到TaskRunner空閑

我想這樣做的方法是在另一個節點上有一個actor(讓我們稱之為Scheduler actor)從TaskRunner節點監聽注冊並保持已發送到哪里的內部狀態。

據推測,如果我這樣做,我只能有一個這個Scheduler actor的實例,因為如果有多個,他們不知道哪個TaskRunner節點當前正忙,所以我們會得到隊列中的任務。

這是否意味着我應該使用Cluster Singleton作為Scheduler actor?

有沒有更好的方法來實現我的目標?

我會說你需要:

  • 調度員演員(集群單身人士)從空閑演員的游泳池向演員發送任務

  • 你的TaskRunner actor應該有兩種狀態:running和idle。 在空閑狀態下,它應該定期向調度員演員注冊(通知它是空閑的)。 通常,因為在節點關閉的情況下調度程序可能會丟失狀態並將單例移動到另一個節點。

  • 調度員本身保留閑置演員列表。 當需要完成新任務且列表不為空時,將從列表中取出工作人員並發送任務(工作人員可以立即從列表中刪除,但可以安全地與Ack一起工作以確保執行任務以進行處理,或者重新執行 - 如果Ack超時則發送給另一名工人)

根據您的要求,您可能需要考慮采用Lightbend的采用pull模型的分布式工作者模板 ,而不是從頭開始構建所有內容。 它主要包括1)維護工人狀態的主集群單例,以及2)從主單例演員注冊和拉取工作的工人的演員系統。

我過去為研發項目調整了模板的改變用途版本,它提供了宣傳的工作拉動功能。 請注意,該模板使用退役的Activator (可以很容易地從主代碼中sbt或替換為sbt )。 它還提供分布式pub-sub和持久性日志,如果不需要,您可以選擇排除日志。 它的源代碼可以在GitHub上找到。

對於您對單身主人和多個工作人員的處理方式,可能存在這樣的情況:您的主人員負擔過多的任務來安排,這可能導致更多時間將任務安排給工人。

因此,您可以讓多個主服務器分配給他們的工作人員子集,而不是將主服務器設置為集群單例 可以通過基於分片密鑰的聚類分片來完成對不同主設備的工作分配。 Akka提供了群集分片 ,你可以參考。

為了使你的主要容錯,你總是可以將持久的角色作為主人。

暫無
暫無

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

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