gRPC Deadlines

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.

Sharing is caring:

Leave a Comment