Test edilebilirlik eylemleri
Güvenilir olmayan bir altyapının benzetimini yapmak için Azure Service Fabric, geliştirici olarak size çeşitli gerçek dünya hatalarının ve durum geçişlerinin benzetimini yapmanın yollarını sağlar. Bunlar test edilebilirlik eylemleri olarak kullanıma sunulur. Eylemler belirli bir hata ekleme, durum geçişi veya doğrulamaya neden olan alt düzey API'lerdir. Bu eylemleri birleştirerek hizmetleriniz için kapsamlı test senaryoları yazabilirsiniz.
Service Fabric, bu eylemlerden oluşan bazı yaygın test senaryoları sağlar. Yaygın durum geçişlerini ve hata durumlarını test etmek için dikkatle seçilen bu yerleşik senaryoları kullanmanızı kesinlikle öneririz. Ancak eylemler, henüz yerleşik senaryoların kapsamına alınmayan veya uygulamanız için özel olarak uyarlanmış senaryolar için kapsam eklemek istediğinizde özel test senaryoları oluşturmak için kullanılabilir.
Eylemlerin C# uygulamaları System.Fabric.dll derlemesinde bulunur. System Fabric PowerShell modülü Microsoft.ServiceFabric.Powershell.dll derlemesinde bulunur. Çalışma zamanı yüklemesinin bir parçası olarak, kullanım kolaylığı sağlamak için ServiceFabric PowerShell modülü yüklenir.
Düzgün ve düzgün olmayan hata eylemleri karşılaştırması
Test edilebilirlik eylemleri iki ana demet olarak sınıflandırılır:
- Düzgün olmayan hatalar: Bu hatalar, makine yeniden başlatmaları ve işlem kilitlenmeleri gibi hataların simülasyonunu oluşturur. Bu tür hatalarda, işlemin yürütme bağlamı aniden durur. Bu, uygulama yeniden başlatılmadan önce durumu temizleme işleminin çalıştırılamabileceği anlamına gelir.
- Düzgün hatalar: Bu hatalar, yük dengeleme tarafından tetiklenen çoğaltma taşımaları ve bırakmaları gibi düzgün eylemlerin benzetimini gerçekleştirir. Bu gibi durumlarda, hizmet kapanış bildirimi alır ve çıkmadan önce durumu temizleyebilir.
Daha iyi kalite doğrulaması için, çeşitli düzgün ve düzgün olmayan hatalar oluştururken hizmeti ve iş iş yükünü çalıştırın. Hizmet işleminin bir iş akışının ortasında aniden çıktığı düzgün olmayan hatalar alıştırması senaryoları. Bu, hizmet çoğaltması Service Fabric tarafından geri yüklendikten sonra kurtarma yolunu sınar. Bu, veri tutarlılığını ve hatalardan sonra hizmet durumunun doğru şekilde korunup korunmadığını test etme konusunda yardımcı olur. Diğer hata kümesi (düzgün olmayan hatalar), hizmetin Service Fabric tarafından taşınan çoğaltmalara doğru tepki vermediğini test eder. Bu, RunAsync yönteminde iptal işlemini test ediyor. Hizmetin ayarlanan iptal belirtecini denetlemesi, durumunu doğru kaydetmesi ve RunAsync yönteminden çıkması gerekir.
Test edilebilirlik eylemleri listesi
Eylem | Açıklama | Yönetilen API | PowerShell cmdlet'i | Düzgün/düzgün olmayan hatalar |
---|---|---|---|---|
CleanTestState | Test sürücüsünün hatalı kapatılması durumunda kümeden tüm test durumunu kaldırır. | CleanTestStateAsync | Remove-ServiceFabricTestState | Uygulanamaz |
InvokeDataLoss | Veri kaybını bir hizmet bölümüne neden eder. | InvokeDataLossAsync | Invoke-ServiceFabricPartitionDataLoss | Zarif |
InvokeQuorumLoss | Belirli bir durum bilgisi olan hizmet bölümünü çekirdek kaybına yerleştirir. | InvokeQuorumLossAsync | Invoke-ServiceFabricQuorumLoss | Zarif |
MovePrimary | Durum bilgisi olan bir hizmetin belirtilen birincil çoğaltmasını belirtilen küme düğümüne taşır. | MovePrimaryAsync | Move-ServiceFabricPrimaryReplica | Zarif |
MoveSecondary | Durum bilgisi olan bir hizmetin geçerli ikincil çoğaltmasını farklı bir küme düğümüne taşır. | MoveSecondaryAsync | Move-ServiceFabricSecondaryReplica | Zarif |
MoveInstance | Durum bilgisi olmayan bir hizmetin geçerli örneğini farklı bir küme düğümüne taşır. | MoveInstanceAsync | Move-ServiceFabricInstance | Zarif |
RemoveReplica | Bir çoğaltmayı kümeden kaldırarak bir çoğaltma hatasının benzetimini gerçekleştirir. Bu işlem çoğaltmayı kapatır ve kümeden durumunun tümünü kaldırarak 'Yok' rolüne geçirir. | RemoveReplicaAsync | Remove-ServiceFabricReplica | Zarif |
RestartDeployedCodePackage | Kümedeki bir düğüme dağıtılan bir kod paketini yeniden başlatarak kod paketi işlemi hatasının benzetimini gerçekleştirir. Bu işlem, kod paketi işlemini durdurur ve bu işlemde barındırılan tüm kullanıcı hizmeti çoğaltmalarını yeniden başlatır. | RestartDeployedCodePackageAsync | Restart-ServiceFabricDeployedCodePackage | Düzgün Değil |
RestartNode | Bir düğümü yeniden başlatarak Service Fabric küme düğümü hatasının benzetimini gerçekleştirir. | RestartNodeAsync | Restart-ServiceFabricNode | Düzgün Değil |
RestartPartition | Bir bölümün bazı veya tüm çoğaltmalarını yeniden başlatarak veri merkezi karartma veya küme karartma senaryosu benzetimi gerçekleştirir. | RestartPartitionAsync | Restart-ServiceFabricPartition | Zarif |
RestartReplica | Bir kümede kalıcı bir çoğaltmayı yeniden başlatıp çoğaltmayı kapatıp yeniden açarak çoğaltma hatasının benzetimini gerçekleştirir. | RestartReplicaAsync | Yeniden Başlatma-ServiceFabricReplica | Zarif |
StartNode | Zaten durdurulmuş bir kümedeki düğümü başlatır. | StartNodeAsync | Start-ServiceFabricNode | Uygulanamaz |
StopNode | Kümedeki bir düğümü durdurarak düğüm hatasının benzetimini gerçekleştirir. StartNode çağrılana kadar düğüm çalışır durumda kalır. | StopNodeAsync | Stop-ServiceFabricNode | Düzgün Değil |
ValidateApplication | Bir uygulama içindeki tüm Service Fabric hizmetlerinin kullanılabilirliğini ve sistem durumunu doğrular; genellikle sistemde bir hata oluştuktan sonra. | ValidateApplicationAsync | Test-ServiceFabricApplication | Uygulanamaz |
ValidateService | Service Fabric hizmetinin kullanılabilirliğini ve sistem durumunu doğrular; genellikle sistemde bir hataya neden olduktan sonra. | ValidateServiceAsync | Test-ServiceFabricService | Uygulanamaz |
PowerShell kullanarak test edilebilirlik eylemi çalıştırma
Bu öğreticide, PowerShell kullanarak test edilebilirlik eylemi çalıştırma işlemi gösterilmektedir. Yerel (bir kutu) kümede veya Azure kümesinde test edilebilirlik eylemi çalıştırmayı öğreneceksiniz. Microsoft.Fabric.Powershell.dll(Service Fabric PowerShell modülü) Microsoft Service Fabric MSI yüklediğinizde otomatik olarak yüklenir. Bir PowerShell istemi açtığınızda modül otomatik olarak yüklenir.
Öğretici segmentleri:
Tek kutulu kümede eylem çalıştırma
Yerel bir kümede test edilebilirlik eylemi çalıştırmak için önce kümeye bağlanın ve PowerShell istemini yönetici modunda açın. Restart-ServiceFabricNode eylemine göz atalım.
Restart-ServiceFabricNode -NodeName Node1 -CompletionMode DoNotVerify
Burada Restart-ServiceFabricNode eylemi "Node1" adlı bir düğümde çalıştırılıyor. Tamamlama modu, restart-node eyleminin gerçekten başarılı olup olmadığını doğrulamaması gerektiğini belirtir. Tamamlama modunun "Doğrula" olarak belirtilmesi, yeniden başlatma eyleminin gerçekten başarılı olup olmadığını doğrulamasına neden olur. Düğümü doğrudan adına göre belirtmek yerine, bir bölüm anahtarı ve çoğaltma türü aracılığıyla aşağıdaki gibi belirtebilirsiniz:
Restart-ServiceFabricNode -ReplicaKindPrimary -PartitionKindNamed -PartitionKey Partition3 -CompletionMode Verify
$connection = "localhost:19000"
$nodeName = "Node1"
Connect-ServiceFabricCluster $connection
Restart-ServiceFabricNode -NodeName $nodeName -CompletionMode DoNotVerify
Bir kümedeki Service Fabric düğümünü yeniden başlatmak için Restart-ServiceFabricNode kullanılmalıdır. Bu, Fabric.exe işlemini durdurur ve bu işlem söz konusu düğümde barındırılan tüm sistem hizmetini ve kullanıcı hizmeti çoğaltmalarını yeniden başlatır. Hizmetinizi test etmek için bu API'yi kullanmak yük devretme kurtarma yolları boyunca hataların ortaya çıkarılmasına yardımcı olur. Kümedeki düğüm hatalarının benzetimini yapmak için yardımcı olur.
Aşağıdaki ekran görüntüsünde Restart-ServiceFabricNode testability komutu çalışırken gösterilmektedir.
İlk Get-ServiceFabricNode (Service Fabric PowerShell modülünden bir cmdlet) çıkışı, yerel kümenin beş düğümü olduğunu gösterir: Node.1 - Node.5. Node.4 adlı düğümde yeniden başlatma-ServiceFabricNode sınanabilirlik eylemi (cmdlet) yürütüldükten sonra düğümün çalışma süresinin sıfırlandığını görürüz.
Azure kümesinde eylem çalıştırma
Bir Azure kümesinde test edilebilirlik eylemi (PowerShell kullanarak) çalıştırmak, eylemi yerel kümede çalıştırmaya benzer. Tek fark, eylemi çalıştırabilmeniz için yerel kümeye bağlanmak yerine önce Azure kümesine bağlanmanız gerektiğidir.
C kullanarak test edilebilirlik eylemi çalıştırma#
C# kullanarak test edilebilirlik eylemini çalıştırmak için önce FabricClient kullanarak kümeye bağlanmanız gerekir. Ardından eylemi çalıştırmak için gereken parametreleri alın. Aynı eylemi çalıştırmak için farklı parametreler kullanılabilir. RestartServiceFabricNode eylemine baktığımızda, bunu çalıştırmanın bir yolu kümedeki düğüm bilgilerini (düğüm adı ve düğüm örneği kimliği) kullanmaktır.
RestartNodeAsync(nodeName, nodeInstanceId, completeMode, operationTimeout, CancellationToken.None)
Parametre açıklaması:
- CompleteMode , modun yeniden başlatma eyleminin gerçekten başarılı olup olmadığını doğrulamaması gerektiğini belirtir. Tamamlama modunun "Doğrula" olarak belirtilmesi, yeniden başlatma eyleminin gerçekten başarılı olup olmadığını doğrulamasına neden olur.
- OperationTimeout , timeoutException özel durumu oluşturmadan önce işlemin bitmesi için gereken süreyi ayarlar.
- CancellationToken bekleyen bir çağrının iptal edilmesine olanak tanır.
Düğümü doğrudan adına göre belirtmek yerine, bir bölüm anahtarı ve çoğaltma türü aracılığıyla belirtebilirsiniz.
Daha fazla bilgi için bkz. PartitionSelector ve ReplicaSelector.
// Add a reference to System.Fabric.Testability.dll and System.Fabric.dll
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Fabric.Testability;
using System.Fabric;
using System.Threading;
using System.Numerics;
class Test
{
public static int Main(string[] args)
{
string clusterConnection = "localhost:19000";
Uri serviceName = new Uri("fabric:/samples/PersistentToDoListApp/PersistentToDoListService");
string nodeName = "N0040";
BigInteger nodeInstanceId = 130743013389060139;
Console.WriteLine("Starting RestartNode test");
try
{
//Restart the node by using ReplicaSelector
RestartNodeAsync(clusterConnection, serviceName).Wait();
//Another way to restart node is by using nodeName and nodeInstanceId
RestartNodeAsync(clusterConnection, nodeName, nodeInstanceId).Wait();
}
catch (AggregateException exAgg)
{
Console.WriteLine("RestartNode did not complete: ");
foreach (Exception ex in exAgg.InnerExceptions)
{
if (ex is FabricException)
{
Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
}
}
return -1;
}
Console.WriteLine("RestartNode completed.");
return 0;
}
static async Task RestartNodeAsync(string clusterConnection, Uri serviceName)
{
PartitionSelector randomPartitionSelector = PartitionSelector.RandomOf(serviceName);
ReplicaSelector primaryofReplicaSelector = ReplicaSelector.PrimaryOf(randomPartitionSelector);
// Create FabricClient with connection and security information here
FabricClient fabricclient = new FabricClient(clusterConnection);
await fabricclient.FaultManager.RestartNodeAsync(primaryofReplicaSelector, CompletionMode.Verify);
}
static async Task RestartNodeAsync(string clusterConnection, string nodeName, BigInteger nodeInstanceId)
{
// Create FabricClient with connection and security information here
FabricClient fabricclient = new FabricClient(clusterConnection);
await fabricclient.FaultManager.RestartNodeAsync(nodeName, nodeInstanceId, CompletionMode.Verify);
}
}
PartitionSelector ve ReplicaSelector
PartitionSelector
PartitionSelector, test edilebilirlik kapsamında kullanıma sunulan bir yardımcıdır ve test edilebilirlik eylemlerinden herhangi birinin gerçekleştirildiği belirli bir bölümü seçmek için kullanılır. Bölüm kimliği önceden biliniyorsa belirli bir bölümü seçmek için kullanılabilir. Veya bölüm anahtarını sağlayabilirsiniz ve işlem bölüm kimliğini dahili olarak çözümler. Ayrıca rastgele bir bölüm seçme seçeneğiniz de vardır.
Bu yardımcıyı kullanmak için PartitionSelector nesnesini oluşturun ve Select* yöntemlerinden birini kullanarak bölümü seçin. Ardından PartitionSelector nesnesini gerektiren API'ye geçirin. Hiçbir seçenek belirlenmezse, varsayılan olarak rastgele bir bölüm olur.
Uri serviceName = new Uri("fabric:/samples/InMemoryToDoListApp/InMemoryToDoListService");
Guid partitionIdGuid = new Guid("8fb7ebcc-56ee-4862-9cc0-7c6421e68829");
string partitionName = "Partition1";
Int64 partitionKeyUniformInt64 = 1;
// Select a random partition
PartitionSelector randomPartitionSelector = PartitionSelector.RandomOf(serviceName);
// Select a partition based on ID
PartitionSelector partitionSelectorById = PartitionSelector.PartitionIdOf(serviceName, partitionIdGuid);
// Select a partition based on name
PartitionSelector namedPartitionSelector = PartitionSelector.PartitionKeyOf(serviceName, partitionName);
// Select a partition based on partition key
PartitionSelector uniformIntPartitionSelector = PartitionSelector.PartitionKeyOf(serviceName, partitionKeyUniformInt64);
ReplicaSelector
ReplicaSelector, test edilebilirlik kapsamında kullanıma sunulan bir yardımcıdır ve test edilebilirlik eylemlerinden herhangi birinin gerçekleştirildiği bir çoğaltmanın seçilmesine yardımcı olmak için kullanılır. Çoğaltma kimliği önceden biliniyorsa, belirli bir çoğaltmayı seçmek için kullanılabilir. Ayrıca, birincil çoğaltmayı veya rastgele ikincil bir çoğaltmayı seçme seçeneğiniz vardır. ReplicaSelector PartitionSelector'dan türetilir, bu nedenle test edilebilirlik işlemini gerçekleştirmek istediğiniz çoğaltmayı ve bölümü seçmeniz gerekir.
Bu yardımcıyı kullanmak için bir ReplicaSelector nesnesi oluşturun ve çoğaltmayı ve bölümü seçmek istediğiniz şekilde ayarlayın. Daha sonra bunu gerektiren API'ye geçirebilirsiniz. Seçenek belirlenmezse, varsayılan olarak rastgele bir çoğaltma ve rastgele bölüm olur.
Guid partitionIdGuid = new Guid("8fb7ebcc-56ee-4862-9cc0-7c6421e68829");
PartitionSelector partitionSelector = PartitionSelector.PartitionIdOf(serviceName, partitionIdGuid);
long replicaId = 130559876481875498;
// Select a random replica
ReplicaSelector randomReplicaSelector = ReplicaSelector.RandomOf(partitionSelector);
// Select the primary replica
ReplicaSelector primaryReplicaSelector = ReplicaSelector.PrimaryOf(partitionSelector);
// Select the replica by ID
ReplicaSelector replicaByIdSelector = ReplicaSelector.ReplicaIdOf(partitionSelector, replicaId);
// Select a random secondary replica
ReplicaSelector secondaryReplicaSelector = ReplicaSelector.RandomSecondaryOf(partitionSelector);