Deadline exceeded error 即使它是简单的平方根函数?

Deadline exceeded error even it simple square root function?

我是 gRPC 新手,我尝试将截止日期值从 1000 增加到 10000000000

这里是代码:

client.js

const path = require('path');

const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');

const packageDefinitition = protoLoader.loadSync(
  path.join(__dirname, '../protos/advanced.proto'),
  {
    keepCase: true,
    longs: String,
    enums: String,
    defaults: true,
    oneofs: true
  }
);

const advancedProto = grpc.loadPackageDefinition(packageDefinitition).advanced;

function main() {
  const client = new advancedProto.Advanced(
    'localhost:50051',
    grpc.credentials.createInsecure()
  );

  client.SqaureRoot({ number: 1 }, { deadline: 10000000000 }, function (err, response) {
    console.log(err, response);
  });
}

main();

server.js

const path = require('path');

const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');

const packageDefinitition = protoLoader.loadSync(
  path.join(__dirname, '../protos/advanced.proto'),
  {
    keepCase: true,
    longs: String,
    enums: String,
    defaults: true,
    oneofs: true
  }
);

const advancedProto = grpc.loadPackageDefinition(packageDefinitition).advanced;

function SqaureRoot(call, callback) {
  if (call.request.number > 0) {
    return callback(null, { result: call.request.number * call.request.number });
  }
  return callback({
    code: grpc.status.INVALID_ARGUMENT,
    message: "The number is not greater than 0"
  })
}

function main() {
  const Server = new grpc.Server();

  Server.addService(advancedProto.Advanced.service, { SqaureRoot });

  Server.bindAsync("127.0.0.1:50051", grpc.ServerCredentials.createInsecure(), function() {
    Server.start();
    console.log(`Server running at 127.0.0.1:50051`);
  });
}

main();

proto_file

syntax = "proto3";

package advanced;

service Advanced {

  // error handling
  rpc SqaureRoot (SquareRootRequest) returns (SquareRootResponse) {};
}

message SquareRootRequest {
  int32 number = 1;
}

message SquareRootResponse {
  double result = 1;
}

当我从客户端执行代码时,无论截止日期是什么,我都会收到此错误

node client
Error: 4 DEADLINE_EXCEEDED: Deadline exceeded
    at Object.callErrorFromStatus (/Users/Desktop/own/grpc-workspace/advanced/node_modules/@grpc/grpc-js/build/src/call.js:31:26)
    at Object.onReceiveStatus (/Users/Desktop/own/grpc-workspace/advanced/node_modules/@grpc/grpc-js/build/src/client.js:180:52)
    at Object.onReceiveStatus (/Users/Desktop/own/grpc-workspace/advanced/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:336:141)
    at Object.onReceiveStatus (/Users/Desktop/own/grpc-workspace/advanced/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:299:181)
    at /Users/Desktop/own/grpc-workspace/advanced/node_modules/@grpc/grpc-js/build/src/call-stream.js:160:78
    at processTicksAndRejections (internal/process/task_queues.js:79:11) {
  code: 4,
  details: 'Deadline exceeded',
  metadata: Metadata { internalRepr: Map {}, options: {} }
} undefined

如果我将截止日期值更改为无穷大,那么它就可以工作。但是我想知道为什么简单的平方根函数不接受截止日期。

你提供了一个很好的重现真的很有帮助!

我认为您的问题是截止日期是时间点(而不是持续时间)。

因此您需要计算从现在开始的截止日期加上一些持续时间:

let d = new Date();
let deadline = d.setSeconds(d.getSeconds() + 5);

client.SquareRoot({
  number: 1,
}, {
  deadline: deadline,
}, (err, response) => {
  console.log(err, response);
});

NOTES your code will work but:

  1. you've a typo SqaureRoot and e.g. SquareRoot[Request|Response].
  2. SqaureRoot (sic.) calculates the square not the square root ;-)
  3. You may want to give your package and service more distinct names to avoid advanced.Advanced
  4. server.start() is blocking and so you may want to put the console.log("server starting") before it.