Deadlines digunakan untuk menentukan berapa lama client menunggu RPC complete sebelum RPC di terminate dengan error DEADLINE_EXCEEDED.
Sangat disarankan untuk set Deadlines dalam setiap RPC call.
Untuk informasi yang lebih mendalam silakan lihat blog post mengenai deadlines di https://grpc.io/blog/deadlines/
Kita akan lakukan implementasi deadline dengan menggunakan code sebelumnya, yaitu code implementasi error handling.
Buka file client/client.js, tambahkan fungsi untuk mengatur typeDeadline dan implementasikan.
var grpc = require('grpc');
var greets = require('../server/greet_pb');
var service = require('../server/greet_grpc_pb');
// function unary(){
// var client = new service.GreetServiceClient('localhost:50051', grpc.credentials.createInsecure());
// var request = new greets.GreetRequest();
// var greeting = new greets.Greeting();
// greeting.setFirstName("Test1");
// greeting.setLastName("Test2");
// request.setGreeting(greeting);
// client.greet(request, (error, response)=>{
// if (!error){
// console.log("Response: ", response.getResult());
// }else{
// console.error(error);
// }
// });
// }
// function callGreetMany(){
// var client = new service.GreetServiceClient(
// 'localhost:50051', grpc.credentials.createInsecure()
// );
// var request = new greets.GreetManyRequest();
// var greeting = new greets.Greeting();
// greeting.setFirstName("Streaming");
// greeting.setLastName("API");
// request.setGreeting(greeting);
// var call = client.greetManyTimes(request, ()=>{});
// call.on("data", (response)=>{
// console.log('Client streaming response: ', response.getResult());
// });
// call.on("status", (status)=>{
// console.log(status.details);
// });
// call.on("error", (error)=>{
// console.error(error.details);
// });
// call.on("end", ()=>{
// console.log("streaming end..");
// });
// }
// function callLongGreeting(){
// var client = new service.GreetServiceClient(
// 'localhost:50051', grpc.credentials.createInsecure()
// );
// var request = new greets.LongGreetRequest();
// var call = client.longGreet(request, (error, response)=>{
// if(!error){
// console.log('server response: ', response.getResult());
// }else{
// console.error(error);
// }
// });
// let count = 0, intervalID = setInterval(function(){
// console.log('Sending message ' + count);
// //request 1
// var request = new greets.LongGreetRequest();
// var greeting = new greets.Greeting();
// greeting.setFirstName('Client');
// greeting.setLastName('Streaming');
// request.setGreet(greeting);
// //request 2
// var request2 = new greets.LongGreetRequest();
// var greeting2 = new greets.Greeting();
// greeting2.setFirstName('Client2');
// greeting2.setLastName('Streaming2');
// request2.setGreet(greeting2);
// call.write(request);
// call.write(request2);
// if(++count > 3){
// clearInterval(intervalID);
// call.end();
// }
// }, 1000);
// }
// //bidi streaming
// async function sleep(interval){
// return new Promise((resolve)=>{
// setTimeout(()=> resolve(), interval)
// });
// }
// async function callBiDirect(){
// var client = new service.GreetServiceClient(
// 'localhost:50051', grpc.credentials.createInsecure()
// );
// var call = client.greetEveryone(request, (error, response)=>{
// console.log('Server response: ' + response);
// });
// call.on('data', response=>{
// console.log('Response from server: ' + response.getResult());
// });
// call.on('error', error =>{
// console.error(error);
// });
// call.on('end', ()=>{
// console.log('End bidi...');
// });
// //simulasi streaming data menggunakan for loop
// for(var i=0; i<10; i++){
// var greeting = new greets.Greeting();
// greeting.setFirstName('Bidi');
// greeting.setLastName('Streaming');
// var request = new greets.GreetEveryoneRequest();
// request.setGreet(greeting);
// call.write(request);
// await sleep(1500);
// }
// call.end();
// }
function getGRPCDeadline (rpcType){
timeAllowed = 5000;
switch (rpcType){
case 1:
timeAllowed = 10;
break;
case 2:
timeAllowed = 7000;
break;
default:
console.log("default time out");
}
return new Date(Date.now()+ timeAllowed);
}
function doErrorCall(){
var deadline = getGRPCDeadline(1);
console.log("Implementasi RPC error handling");
var client = new service.GreetServiceClient(
'localhost:50051', grpc.credentials.createInsecure()
);
var number = 4;
var squareRootRequest = new greets.SquareRootRequest();
squareRootRequest.setNumber(number);
client.squareRoot(squareRootRequest, {deadline: deadline}, (error, response)=>{
if(!error) {
console.log("Square root : " + response.getNumberRoot());
}else{
console.error(error.message);
}
});
}
doErrorCall();
//callBiDirect();
// callLongGreeting();
//callGreetMany();
//unary()
Pada fungsi getGRPCDeadline, untuk kebutuhan demo moduk, kita buat nila case 1 dengan nilai yang sangat kecil, yaitu 10ms.
function getGRPCDeadline (rpcType){
timeAllowed = 5000;
switch (rpcType){
case 1:
timeAllowed = 10;
break;
case 2:
timeAllowed = 7000;
break;
default:
console.log("default time out");
}
return new Date(Date.now()+ timeAllowed);
}
Kita panggil fungsi diatas untuk menggunakan case 1, dan tambahkan object deadline saat melakukan RPC Call.
var deadline = getGRPCDeadline(1);
client.squareRoot(squareRootRequest, {deadline: deadline}, (error, response)=>{
if(!error) {
console.log("Square root : " + response.getNumberRoot());
}else{
console.error(error.message);
}
});
Jika kita jalankan, maka kita akan mendapatkan error
$ node client.js
Implementasi RPC error handling
4 DEADLINE_EXCEEDED: Deadline Exceeded
Dengan menggunakan fungsi untuk mendapatkan RPCDeadline, Anda bisa mengatur deadline lebih flexible.
Dengan berakhirnya modul ini, tutorial gRPC Dasar Menggunakan Node.js sudah selesai.
Semoga bermanfaat.