2017-02-14 6 views
0

У меня есть группа актеров, которые отправляют много сообщений друг другу. Весьма вероятно, что очередь по умолчанию для этих актеров вызовет у многих актеров нехватку памяти.Пересылка мертвой буквы в Akka

В идеале это то, что я хочу, чтобы это произошло:

  1. A посылает B.
  2. B говорит: «Я слишком полна для письма L».
  3. A сказано это и хранит L (возможно, на жестком диске). A продолжает работать.
  4. Как только A простаивает, он оглядывается на любые буквы и находит буквы вроде L, что актеры (например, B) были слишком полны, чтобы потреблять.
  5. A попытки повторной отправки L по B.
  6. Процесс продолжает повторяться.

От каких I have read Мне нужно переключиться на заблокированную очередь. Мое впечатление, если A отправляет сообщение B, но почтовый ящик B s заполнен, B скажет: «Я полон» и вызывают таймаут. Затем он отправляется на номер DeadLetterActorRef по номеру D.

Проблема заключается в адаптации парадигмы «мертвой буквы» Акки к описанным выше шагам. На шаге 3 мне нужен способ сообщить A, что это не удалось, и письмо должно быть сохранено позже. Кажется, что вы «рассказываете» этих актеров, имея их subscribe на автобусе событий DeadLetter. Это заставляет меня заставлять каждого актера подписываться на автобус событий DeadLetter. Если A не смог отправить сообщение, и B не смог отправить сообщение, то сообщение A и B отправлено в очередь DeadLetter, и оба должны сортировать мертвые буквы друг друга, чтобы найти то, что им нужно. Это кажется неэффективным. Есть ли лучший способ сделать это?

Примечание: Я не хочу загрузить баланс мертвых букв, что некоторые статьи предлагают делать с мертвой буквой очереди.

ответ

1

Поведение, которое вы ищете, называется «противодавление». В акке, которая поддерживается с использованием потоков акка, см. Эту презентацию https://www.lightbend.com/blog/understanding-akka-streams-back-pressure-and-asynchronous-architectures

+0

О, мальчик, еще одна рамка для изучения. Ха-ха. Благодарю. – Dair

+0

Я собираюсь не принимать этот ответ на данный момент. Если смотреть на проблему больше, кажется, что потоки не работают в моем случае. Каждый актер в моей системе должен общаться с каждым другим актером в системе. Если я правильно понимаю, имея 100 действующих лиц, то для такого мелкозернистого общения будет 100 источников на каждого актера. Может быть, вы можете помочь? – Dair

Смежные вопросы