Реализация резервного копирования и восстановления Reliable Actors
Примечание.
Корпорация Майкрософт рекомендует использовать периодическое резервное копирование и восстановление для настройки резервного копирования данных из надежной службы с отслеживанием состояния и Reliable Actors.
В следующем примере пользовательская служба субъектов предоставляет метод для резервного копирования данных субъектов с использованием прослушивателя удаленных взаимодействий, уже присутствующего в ActorService
:
public interface IMyActorService : IService
{
Task BackupActorsAsync();
}
class MyActorService : ActorService, IMyActorService
{
public MyActorService(StatefulServiceContext context, ActorTypeInformation typeInfo, Func<ActorBase> newActor)
: base(context, typeInfo, newActor)
{ }
public Task BackupActorsAsync()
{
return this.BackupAsync(new BackupDescription(PerformBackupAsync));
}
private async Task<bool> PerformBackupAsync(BackupInfo backupInfo, CancellationToken cancellationToken)
{
try
{
// store the contents of backupInfo.Directory
return true;
}
finally
{
Directory.Delete(backupInfo.Directory, recursive: true);
}
}
}
public interface MyActorService extends Service
{
CompletableFuture<?> backupActorsAsync();
}
class MyActorServiceImpl extends ActorService implements MyActorService
{
public MyActorService(StatefulServiceContext context, ActorTypeInformation typeInfo, Func<FabricActorService, ActorId, ActorBase> newActor)
{
super(context, typeInfo, newActor);
}
public CompletableFuture backupActorsAsync()
{
return this.backupAsync(new BackupDescription((backupInfo, cancellationToken) -> performBackupAsync(backupInfo, cancellationToken)));
}
private CompletableFuture<Boolean> performBackupAsync(BackupInfo backupInfo, CancellationToken cancellationToken)
{
try
{
// store the contents of backupInfo.Directory
return true;
}
finally
{
deleteDirectory(backupInfo.Directory)
}
}
void deleteDirectory(File file) {
File[] contents = file.listFiles();
if (contents != null) {
for (File f : contents) {
deleteDirectory(f);
}
}
file.delete();
}
}
В этом примере IMyActorService
— это контракт удаленного взаимодействия, который реализует класс IService
(C#) и Service
(Java), а затем реализуется классом MyActorService
. При добавлении удаленного контракта методы в классе IMyActorService
становятся доступными для клиента за счет создания прокси-сервера удаленного взаимодействия с помощью метода ActorServiceProxy
.
IMyActorService myActorServiceProxy = ActorServiceProxy.Create<IMyActorService>(
new Uri("fabric:/MyApp/MyService"), ActorId.CreateRandom());
await myActorServiceProxy.BackupActorsAsync();
MyActorService myActorServiceProxy = ActorServiceProxy.create(MyActorService.class,
new URI("fabric:/MyApp/MyService"), actorId);
myActorServiceProxy.backupActorsAsync();
Дополнительные сведения о Reliable Actors см. в этих статьях: