Deadlines, Cancellation और Interceptors
deadlines के साथ timeouts लागू करें, CancellationToken को आगे भेजें और gRPC interceptors के माध्यम से cross-cutting concerns जोड़ें।
Deadlines, Cancellation और Interceptors, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
gRPC में विश्वसनीयता: समय-सीमाएँ और रद्दीकरण
उत्पादन gRPC सेवाओं को विश्वसनीयता से जुड़ी दो महत्वपूर्ण बातों को संभालना चाहिए: समय-सीमाएँ (client कितनी देर तक प्रतीक्षा करेगा) और रद्दीकरण (काम को जल्दी रोकना)। साथ मिलकर ये संसाधनों की समाप्ति और श्रृंखलाबद्ध विफलताओं को रोकते हैं।
कॉल पर समय-सीमा निर्धारित करना
समय-सीमा वह निश्चित समय-बिंदु है जिसके भीतर कॉल पूरा होना चाहिए। इसे CallOptions के साथ निर्धारित करें। समय-सीमा पार होने पर सर्वर को रद्दीकरण प्राप्त होता है और client को StatusCode.DeadlineExceeded मिलता है।
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);Client पर DeadlineExceeded संभालना
RpcException को पकड़ें और अन्य त्रुटियों से समय-सीमा समाप्त होने की स्थिति अलग पहचानने के लिए स्थिति कोड जाँचें।
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}");
}सर्वर पर समय-सीमाओं का पालन करना
लंबे समय तक चलने वाले काम के दौरान सर्वर को context.CancellationToken जाँचना चाहिए। समय-सीमा समाप्त होने पर यह token अपने-आप रद्द हो जाता है।
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 का प्रसार
सर्वर के cancellation token को हर async call श्रृंखला में हमेशा आगे भेजें। यदि आप इसे अनदेखा करते हैं, तो रद्द किए गए calls अनावश्यक रूप से संसाधनों का उपयोग करते रहते हैं।
// 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 इंटरसेप्टर: अवधारणा
इंटरसेप्टर, ASP.NET Core मिडलवेयर के gRPC समकक्ष होते हैं—वे RPC calls से पहले और बाद में चलते हैं और अनुरोधों, प्रतिक्रियाओं तथा अपवादों का निरीक्षण या उनमें बदलाव कर सकते हैं। ये लॉग दर्ज करने, प्रमाणीकरण और पुनःप्रयास तर्क के लिए आदर्श हैं।
सर्वर-पक्ष इंटरसेप्टर बनाना
Interceptor से इनहेरिट करें और जिस विधि प्रकार को इंटरसेप्ट करना चाहते हैं, उसे ओवरराइड करें। वास्तविक handler तक आगे बढ़ने के लिए continuation कॉल करें।
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;
}
}सर्वर इंटरसेप्टर पंजीकृत करना
इंटरसेप्टर को सभी सेवाओं के लिए वैश्विक रूप से या किसी विशिष्ट सेवा के लिए Program.cs में पंजीकृत करें। DI कंटेनर कंस्ट्रक्टर की निर्भरताएँ हल कर देता है।
// 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>();Client-पक्ष इंटरसेप्टर
Client इंटरसेप्टर बाहर जाने वाले calls को लपेटते हैं—हर call site में बदलाव किए बिना प्रमाणीकरण हेडर, पुनःप्रयास तर्क या सहसंबंध ID जोड़ने के लिए उपयोगी हैं।
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);अपवाद इंटरसेप्टर
सर्वर-पक्ष का अपवाद इंटरसेप्टर अनियंत्रित अपवादों को RpcExceptions में बदल देता है और आंतरिक विवरण Clients तक पहुँचने से रोकता है।
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"));
}
}
}त्वरित जाँच
जब कोई gRPC call अपनी समय-सीमा पार कर जाता है, तो क्या होता है?
पुनरावलोकन: समय-सीमाएँ, रद्दीकरण और इंटरसेप्टर
मुख्य बातें:
- असीमित प्रतीक्षा रोकने के लिए client calls पर हमेशा समय-सीमाएँ निर्धारित करें
- सर्वर पर
context.CancellationTokenजाँचें और उसे सभी async calls में आगे भेजें - इंटरसेप्टर साझा सरोकारों (लॉग दर्ज करना, प्रमाणीकरण, त्रुटियों का रूपांतरण) को सेवा कोड को जटिल बनाए बिना संभालते हैं
- सर्वर इंटरसेप्टर: यूनरी/स्ट्रीम handler विधियों को ओवरराइड करें और
continuationकॉल करें - Client इंटरसेप्टर: चैनल के कॉल-प्रेषक क्रम से जोड़ें
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “Deadlines, Cancellation और Interceptors” पाठ निःशुल्क है?
हाँ—“Deadlines, Cancellation और Interceptors” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Deadlines, Cancellation और Interceptors” में मैं क्या सीखूँगा?
deadlines के साथ timeouts लागू करें, CancellationToken को आगे भेजें और gRPC interceptors के माध्यम से cross-cutting concerns जोड़ें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“Deadlines, Cancellation और Interceptors” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- gRPC और Protobuf की मूल बातें
- Unary और Server Streaming RPCs
- Client और Bidirectional Streaming
- Deadlines, Cancellation और Interceptors