我有一群演员互相发送大量信息。这些actor的默认队列很可能会导致很多actor耗尽内存。
理想情况下,这就是我想要发生的事情:
A
发送给B
。B
说“我太满了字母L
。”A
被告知这一点,并存储L
(可能在硬盘中)。 A
继续工作。A
闲置,他会回顾任何字母并找到像L
这样的字母,其中演员(例如B
)太满而无法使用。A
尝试将L
重新发送给B
。从I have read我需要切换到阻塞队列。我的印象是,如果A
向B
发送邮件,但B
的邮箱已满,B
会说“我已满”并导致超时。然后会将其发送到名为DeadLetterActorRef
的{{1}}。
问题在于使Akka的“死信范式”适应上述步骤。在第3步,我需要一种方法告诉D
它失败了,这封信应该保存以供日后使用。看来你通过让他们A
到subscribe
事件总线来“告诉”这些演员。这迫使我让每个演员订阅DeadLetter
事件总线。如果DeadLetter
无法发送消息且A
无法发送消息,则B
和A
的消息将被发送到B
队列,并且两者都有通过彼此的死信来找出他们需要的那个。这似乎效率低下。有没有更好的方法来解决这个问题?
注意:我不想要对死信进行负载均衡,有些文章建议使用死信队列。
答案 0 :(得分:2)
您正在寻找的行为称为“背压”。 在使用akka流支持的akka中,请参阅此演示文稿 https://www.lightbend.com/blog/understanding-akka-streams-back-pressure-and-asynchronous-architectures