АККА. NET случайным образом отправляет сообщения в тупики - PullRequest
1 голос
/ 21 марта 2020

У меня есть система актера, которая случайно выходит из строя из-за того, что сообщения доставляются мертвыми буквами. Ошибка, означающая, что она просто не завершается MySystem-Actor-System / user /.../ DropboxToBlobSourceSubmissionUploaderActor не был доставлен. [5] встречаются мертвые буквы. Эту регистрацию можно отключить или настроить с помощью параметров конфигурации «akka.log-dead-letters» и «akka.log-dead-letters-во время завершения работы».

private void InitialState()
{
    Receive<UploadFileFromDropboxMessage>(msg =>
    {
        var sender = Sender;
        var self = Self;
        var parent = Parent;
        var logger = Logger;
        UploadFromDropboxToBlobStorageAsync(msg.File, msg.RelativeSourceRootDirectory, msg.BlobStorageDestinationRootPath).ContinueWith(o =>
        {
            if (!o.IsFaulted)
            {
                parent.Tell(new UploadFileFromDropboxSuccessMessage(msg.File.Path, o.Result), self);
            }
            else
            {
                parent.Tell(new UploadFileFromDropboxFailureMessage(msg.File.Path), self);

            }
        }, TaskContinuationOptions.ExecuteSynchronously);
    });
}

Я также пытался

private void InitialState()
{
    Receive<UploadFileFromDropboxMessage>(msg =>
    {
        try
        {
            var result = UploadFromDropboxToBlobStorageAsync(msg.File, msg.RelativeSourceRootDirectory, msg.BlobStorageDestinationRootPath).Result;
            Parent.Tell(new UploadFileFromDropboxSuccessMessage(msg.File.Path, result));
        }
        catch (Exception ex)
        {
            Parent.Tell(new UploadFileFromDropboxFailureMessage(msg.File.Path, ex));
        }
    });
}

Это происходит случайным образом и происходит как при успешном завершении, так и при завершении. Я проверил parent.IsNobody () ... и это возвращает false. В документации говорится, что alocal субъект может потерпеть неудачу:

  • , если почтовый ящик не принимает сообщение (например, полный BoundedMailbox)
  • , если принимающий субъект не работает во время обработки сообщения или является уже завершено

Я не могу представить вариант использования, где это правда, но я также не знаю, как проверить из контекста моего текущего актера (даже если это только для целей регистрации).

РЕДАКТИРОВАТЬ: Есть ли у AKKA ограничение на общее количество сообщений во всей системе?

РЕДАКТИРОВАТЬ: Это происходит 1, скажем, в 10% случаев.

РЕДАКТИРОВАТЬ: В конечном итоге обнаружил, что это был актер waaay выше в дереве, которое убивают. Я до сих пор не понимаю, почему IsNobody () вернул false, если он действительно мертв.

...