Son tarihleri ve iptali olan güvenilir gRPC Hizmetleri

, James bAyKiNg

Son tarihleri ve iptali, gRPC istemcileri tarafından devam eden çağrıları durdurmak için kullanılan özelliklerdir. Bu makalede, son tarihleri ve iptali önemli ve bunların .NET gRPC uygulamalarında nasıl kullanılacağı açıklanmaktadır.

Tarihi

Son Tarih, bir gRPC istemcisinin, çağrının tamamlanmasını bekleyeceği süreyi belirtmesini sağlar. Son Tarih aşıldığında, çağrı iptal edilir. Bir çağrının ne kadar süreyle çalıştırılabildiğinden bir üst sınır sağladığından son tarih ayarlama önemlidir. Yanlış çalışan hizmetlerin sürekli olarak çalıştırılmasını ve sunucu kaynaklarının tüketilmesi işlemini sonlandırır. Son tarihler, güvenilir uygulamalar oluşturmak için yararlı bir araçtır ve yapılandırılmalıdır.

Son Tarih yapılandırması:

  • Bir son tarih, CallOptions.Deadline bir çağrı yapıldığında kullanılarak yapılandırılır.
  • Varsayılan son tarih değeri yok. Son Tarih belirtilmediği takdirde gRPC çağrılarının süresi sınırlı değildir.
  • Son Tarih, son tarihin aşılacağı UTC zamandır. Örneğin, DateTime.UtcNow.AddSeconds(5) Şu anda 5 saniyelik bir son tarih.
  • Geçmişte veya geçerli bir zaman kullanılırsa, çağrı son tarihi de aşar.
  • Son Tarih, gRPC çağrısıyla birlikte gönderilir ve hem istemci hem de hizmet tarafından bağımsız olarak izlenir. Bir tek makinede gRPC çağrısı tamamlanır, ancak yanıtın istemciye döndürdüğü zamana göre son tarih aşılmıştır.

Son Tarih aşılırsa, istemci ve hizmetin farklı bir davranışı vardır:

  • İstemci, temel alınan HTTP isteğini hemen iptal eder ve bir DeadlineExceeded hata oluşturur. İstemci uygulaması, hatayı yakalamak ve kullanıcıya bir zaman aşımı iletisi göstermek için seçim yapabilir.
  • Sunucusunda, yürütülen HTTP isteği iptal edilir ve Servercallcontext. CancellationToken oluşturulur. HTTP isteği iptal edilse de, gRPC çağrısı, yöntem tamamlanana kadar sunucuda çalışmaya devam eder. İptal belirtecinin çağrı ile birlikte iptal edilmesi için zaman uyumsuz yöntemlere geçirilmesi önemlidir. Örneğin, zaman uyumsuz veritabanı sorgularına ve HTTP isteklerine bir iptal belirteci geçirme. İptal belirtecinin geçirilmesi, iptal edilen çağrının sunucuda hızlı bir şekilde tamamlanmasını ve diğer çağrılar için kaynakların serbest geçirilmesini sağlar.

CallOptions.DeadlineBir gRPC çağrısının son tarihini ayarlamak için yapılandırın:

var client = new Greet.GreeterClient(channel);

try
{
    var response = await client.SayHelloAsync(
        new HelloRequest { Name = "World" },
        deadline: DateTime.UtcNow.AddSeconds(5));
    
    // Greeting: Hello World
    Console.WriteLine("Greeting: " + response.Message);
}
catch (RpcException ex) when (ex.StatusCode == StatusCode.DeadlineExceeded)
{
    Console.WriteLine("Greeting timeout.");
}

ServerCallContext.CancellationTokenGRPC hizmetinde kullanma:

public override async Task<HelloReply> SayHello(HelloRequest request,
    ServerCallContext context)
{
    var user = await _databaseContext.GetUserAsync(request.Name,
        context.CancellationToken);

    return new HelloReply { Message = "Hello " + user.DisplayName };
}

Son tarihleri yayma

Çalıştırılan bir gRPC hizmetinden bir gRPC çağrısı yapıldığında, son tarih yayılmalıdır. Örnek:

  1. FrontendService.GetUserSon tarihi olan istemci uygulaması çağrıları.
  2. FrontendService çağırır UserService.GetUser . İstemci tarafından belirtilen son tarih, yeni gRPC çağrısıyla belirtilmelidir.
  3. UserService.GetUser Son tarihi alır. İstemci uygulamasının son tarihi aşılırsa, doğru zaman aşımına uğrar.

Çağrı bağlamı son tarihi şu şekilde sağlar ServerCallContext.Deadline :

public override async Task<UserResponse> GetUser(UserRequest request,
    ServerCallContext context)
{
    var client = new User.UserServiceClient(_channel);
    var response = await client.GetUserAsync(
        new UserRequest { Id = request.Id },
        deadline: context.Deadline);

    return response;
}

Son tarihleri el ile yayma, mabera olabilir. Son tarihin her çağrıya geçirilmesi gerekir ve yanlışlıkla kaçırılması kolaydır. GRPC istemci fabrikası ile bir otomatik çözüm bulunur. Belirtme EnableCallContextPropagation :

  • Son Tarih ve iptal belirtecini alt çağrılara otomatik olarak yayar.
  • , Karmaşık, iç içe geçmiş gRPC senaryolarının her zaman son tarihi ve iptali yaymasını sağlamaya yönelik mükemmel bir yoldur.
services
    .AddGrpcClient<User.UserServiceClient>(o =>
    {
        o.Address = new Uri("https://localhost:5001");
    })
    .EnableCallContextPropagation();

Daha fazla bilgi için bkz. .NET'te gRPC istemci fabrikası tümleştirmesi.

İptal

İptal etme, gRPC istemcisinin artık gerekli olmayan uzun çalışan çağrıları iptal etmesine olanak tanır. Örneğin, Kullanıcı bir Web sitesindeki sayfayı ziyaret ettiğinde gerçek zamanlı güncelleştirmeleri akıp bir gRPC çağrısı başlatılır. Kullanıcı sayfadan uzaklaştığında akış iptal edilmelidir.

Bir gRPC çağrısı, CallOptions. CancellationToken ile bir iptal belirteci geçirerek veya çağrıya çağrı yaparak istemcide iptal edilebilir Dispose .

private AsyncServerStreamingCall<HelloReply> _call;

public void StartStream()
{
    _call = client.SayHellos(new HelloRequest { Name = "World" });

    // Read response in background task.
    _ = Task.Run(async () =>
    {
        await foreach (var response in _call.ResponseStream.ReadAllAsync())
        {
            Console.WriteLine("Greeting: " + response.Message);
        }
    });
}

public void StopStream()
{
    _call.Dispose();
}

iptal edilecek gRPC Hizmetleri:

  • ServerCallContext.CancellationTokenZaman uyumsuz yöntemlere geçirin. Zaman uyumsuz yöntemlerin iptal edilmesi, sunucudaki çağrının hızlı bir şekilde tamamlanmasını sağlar.
  • İptal belirtecini alt çağrılara yay. İptal belirtecini yayan alt çağrıların üst öğesiyle iptal edilmesini sağlar. GRPC istemci fabrikası ve EnableCallContextPropagation() iptal belirtecini otomatik olarak yayar.

Ek kaynaklar