Son Tarihler, İptal ve Araya Giriciler
Son tarihlerle zaman aşımı uygulayın, CancellationToken'ı aktarın ve gRPC araya giricileriyle ortak işlevler ekleyin.
Son Tarihler, İptal ve Araya Giriciler, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
gRPC'de Güvenilirlik: Zaman Sınırları ve İptal
Üretim gRPC hizmetleri, iki kritik güvenilirlik sorununu ele almalıdır: zaman sınırları (istemcinin ne kadar bekleyeceği) ve iptal (çalışmayı erkenden durdurma). Birlikte, kaynakların tükenmesini ve zincirleme hataları önlerler.
Çağrıya Zaman Sınırı Belirleme
Zaman sınırı, çağrının tamamlanması gereken mutlak zaman noktasıdır. Bunu CallOptions ile ayarlayın. Süre aşılırsa sunucu bir iptal alır ve istemci StatusCode.DeadlineExceeded alır.
var deadline = DateTime.UtcNow.AddSeconds(5);
var reply = await client.GetOrderAsync(
new GetOrderRequest { Id = 42 },
deadline: deadline);
// Or via CallOptions:
var options = new CallOptions(deadline: deadline);
var reply2 = await client.GetOrderAsync(
new GetOrderRequest { Id = 42 }, options);İstemcide DeadlineExceeded Durumunu Ele Alma
Zaman sınırının aşılmasını diğer hatalardan ayırmak için RpcException yakalayın ve durum kodunu denetleyin.
try
{
var reply = await client.GetOrderAsync(
new GetOrderRequest { Id = 42 },
deadline: DateTime.UtcNow.AddSeconds(3));
}
catch (RpcException ex) when (ex.StatusCode == StatusCode.DeadlineExceeded)
{
Console.WriteLine("Call timed out");
}
catch (RpcException ex)
{
Console.WriteLine($"gRPC error: {ex.Status.Detail}");
}Sunucuda Zaman Sınırlarına Uyma
Sunucu, uzun süren çalışmalar sırasında context.CancellationToken değerini denetlemelidir. Zaman sınırı geçtiğinde bu token otomatik olarak iptal edilir.
public override async Task<ReportResponse> GenerateReport(
ReportRequest request,
ServerCallContext context)
{
var ct = context.CancellationToken;
// Pass ct to every async call — work stops when deadline hits
var data = await _db.FetchLargeDatasetAsync(request.Filters, ct);
var report = await _reportEngine.BuildAsync(data, ct);
ct.ThrowIfCancellationRequested(); // explicit check before CPU work
return MapToResponse(report);
}CancellationToken Yayılımı
Sunucunun iptal token'ını her async çağrı zinciri boyunca her zaman aktarın. Bunu yok sayarsanız iptal edilen çağrılar gereksiz yere kaynak tüketmeye devam eder.
// GOOD: token flows through the call chain
await _db.Products.AsNoTracking()
.Where(p => p.IsActive)
.ToListAsync(context.CancellationToken); // cancels if client disconnects
// BAD: ignores cancellation
await _db.Products.ToListAsync(); // keeps running after deadlinegRPC Araya Giricileri: Kavram
Araya giriciler, gRPC'de ASP.NET Core ara yazılımının karşılığıdır — RPC çağrılarından önce veya sonra çalışır ve istekleri, yanıtları ve özel durumları inceleyebilir ya da değiştirebilir. Günlük kaydı, kimlik doğrulama ve yeniden deneme mantığı için idealdir.
Sunucu Tarafı Araya Giricisi Oluşturma
Interceptor sınıfından türetin ve araya girmek istediğiniz yöntem türünü geçersiz kılın. Gerçek işleyiciye ilerlemek için continuation çağrısını yapın.
using Grpc.Core.Interceptors;
public class LoggingInterceptor : Interceptor
{
private readonly ILogger<LoggingInterceptor> _logger;
public LoggingInterceptor(ILogger<LoggingInterceptor> l) => _logger = l;
public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(
TRequest request,
ServerCallContext context,
UnaryServerMethod<TRequest, TResponse> continuation)
{
_logger.LogInformation("gRPC call: {Method}", context.Method);
var sw = System.Diagnostics.Stopwatch.StartNew();
var response = await continuation(request, context);
_logger.LogInformation("Completed in {Ms}ms", sw.ElapsedMilliseconds);
return response;
}
}Sunucu Araya Giricilerini Kaydetme
Araya giricileri tüm hizmetler için genel olarak veya hizmet başına Program.cs içinde kaydedin. DI kapsayıcısı, oluşturucu bağımlılıklarını çözümler.
// Globally for all gRPC services:
builder.Services.AddGrpc(opt =>
opt.Interceptors.Add<LoggingInterceptor>());
// Or per service:
builder.Services.AddGrpc();
builder.Services.AddSingleton<LoggingInterceptor>();
app.MapGrpcService<OrderService>()
.AddInterceptor<LoggingInterceptor>();İstemci Tarafı Araya Giricileri
İstemci araya giricileri giden çağrıları sarar — her çağrı konumunu değiştirmeden kimlik doğrulama üstbilgileri, yeniden deneme mantığı veya ilişkilendirme kimlikleri eklemek için kullanışlıdır.
public class AuthInterceptor : Interceptor
{
private readonly ITokenProvider _tokens;
public AuthInterceptor(ITokenProvider t) => _tokens = t;
public override AsyncUnaryCall<TResponse> AsyncUnaryCall<TRequest, TResponse>(
TRequest request,
ClientInterceptorContext<TRequest, TResponse> context,
AsyncUnaryCallContinuation<TRequest, TResponse> continuation)
{
var headers = context.Options.Headers ?? new Metadata();
headers.Add("authorization", $"Bearer {_tokens.GetToken()}");
var newContext = new ClientInterceptorContext<TRequest, TResponse>(
context.Method, context.Host,
context.Options.WithHeaders(headers));
return continuation(request, newContext);
}
}
// Attach to channel:
var invoker = channel.Intercept(new AuthInterceptor(tokenProvider));
var client = new OrderService.OrderServiceClient(invoker);Özel Durum Araya Giricisi
Sunucu tarafındaki özel durum araya giricisi, işlenmeyen özel durumları RpcExceptions değerlerine dönüştürerek iç ayrıntıların istemcilere sızmasını önler.
public class ExceptionInterceptor : Interceptor
{
public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(
TRequest request,
ServerCallContext context,
UnaryServerMethod<TRequest, TResponse> continuation)
{
try
{
return await continuation(request, context);
}
catch (NotFoundException ex)
{
throw new RpcException(new Status(StatusCode.NotFound, ex.Message));
}
catch (Exception ex)
{
throw new RpcException(new Status(StatusCode.Internal, "Internal error"));
}
}
}Hızlı Kontrol
Bir gRPC çağrısı zaman sınırını aşarsa ne olur?
Özet: Zaman Sınırları, İptal ve Araya Giriciler
Temel çıkarımlar:
- Sınırsız beklemeleri önlemek için istemci çağrılarında her zaman zaman sınırları belirleyin
- Sunucuda
context.CancellationTokendeğerini denetleyin ve tüm async çağrılara aktarın - Araya giriciler, hizmet kodunu karmaşıklaştırmadan ortak sorunları (günlük kaydı, kimlik doğrulama, hata eşleme) ele alır
- Sunucu araya giricileri: Tekli/akış işleyici yöntemlerini geçersiz kılın ve
continuationçağrısını yapın - İstemci araya giricileri: channel çağrı yönlendiricisi zincirine eklenir
Sıkça Sorulan Sorular
“Son Tarihler, İptal ve Araya Giriciler” dersi ücretsiz mi?
Evet — “Son Tarihler, İptal ve Araya Giriciler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Son Tarihler, İptal ve Araya Giriciler” dersinde ne öğreneceğim?
Son tarihlerle zaman aşımı uygulayın, CancellationToken'ı aktarın ve gRPC araya giricileriyle ortak işlevler ekleyin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Son Tarihler, İptal ve Araya Giriciler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- gRPC ve Protobuf Temelleri
- Tekli ve Sunucu Akışlı RPC'ler
- İstemci ve Çift Yönlü Akış
- Son Tarihler, İptal ve Araya Giriciler