Служба Fabri c Statefull Service, как избежать InvalidOperationException при длительной транзакции с большими значениями - PullRequest
0 голосов
/ 25 января 2020

У меня довольно длительная транзакция, которая обновляет большие значения (словари) в нескольких надежных коллекциях. Я продолжаю сталкиваться с InvalidOperationExceptions (транзакция фиксируется или откатывается), и повторная попытка операции просто приводит к исключению снова. Есть ли что-нибудь, что я могу сделать, чтобы смягчить проблему?

Я предполагаю, что это связано с усечением блокировки транзакций в журнале транзакций, как сказано в документации. Поможет ли сделать журнал больше или меньше?

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-reliable-collections-guidelines

Обрабатывать InvalidOperationException. Пользовательские транзакции могут быть прерваны системой по разным причинам. Например, когда диспетчер надежного состояния меняет свою роль с «Основной» или когда длительная транзакция блокирует усечение журнала транзакций. В таких случаях пользователь может получить InvalidOperationException, указывающий, что его транзакция уже была завершена. Предполагая, что завершение транзакции не было запрошено пользователем, лучший способ обработать это исключение состоит в том, чтобы утилизировать транзакцию, проверить, был ли сигнализирован токен отмены (или была изменена роль реплики), и если не создать, новая транзакция и повторите попытку.

1 Ответ

0 голосов
/ 25 января 2020

Ну, точно не знаю, какой именно параметр сделал это, но я заставил его работать со следующим

        new ReliableStateManagerConfiguration(new ReliableStateManagerReplicatorSettings
        {
            CheckpointThresholdInMB = 4096,
            MaxRecordSizeInKB = 1024 * 1024,
            MinLogSizeInMB = 4096,
        })))

Думая, что неуклюжий MinLogSizeInMB остановил его от попытки усечь журнал во время транзакции из-за большого ценности.

К сожалению, это позволяет завершить одну транзакцию. В конечном итоге журнал должен урезаться, и в зависимости от того, какая транзакция выполняется, происходит сбой, и ее необходимо повторить. Было бы хорошо, если бы был какой-то способ обойти это. Я испытываю желание сделать MinLogSizeInMB огромным числом, чтобы сделать эти ошибки как можно меньшими и далекими между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...