我的软件正在一个系统上运行,该系统由外部服务器任意设置其系统时钟。 (a)发生了多少时间变化,没有任何规则或保证; (b)这段时间的变化经常发生。
我的第一个问题:在这种情况下是否有关于处理截止日期的最佳做法,因为截止日期是(截至目前)绝对时间而非持续时间?
我的第二个问题:如果我的软件不关心递送确认和rpc呼叫的返回值,我是否可以安全地将截止日期设置为“现在”或甚至是过去的时间以便进行rpc呼叫尽快回来?即如果截止日期是过去的,那么rpc的传出有效负载是否可以保证发送?
并不重要,但我在不同的应用程序中同时使用gRPC的.NET和C ++实现。
答案 0 :(得分:4)
根据gRPC doc,没有一种直接的方法可以确定最佳的截止日期。如果您的服务像Greeter example一样简单,那么100毫秒的期限就可以了。但是,如果您的服务是复杂的(例如全球分布的)或必须在数据库中执行大型复杂的查询,那么您就必须考虑许多因素,例如
和许多其他。有关设置截止日期的建议方法,请参见Setting a deadline部分。另外,截止期限也要计算经过的时间,而不是取决于系统时钟,因为系统时钟可以更改为向后或向前。
如果您的软件不关心rpc调用的返回值,则可以在其他线程中进行调用,然后继续使用常规线程。
答案 1 :(得分:0)
截止日期是绝对时间,但这并不意味着绝对的挂钟时间。它们通常应使用不受用户日期/时间变化影响的单调时钟。 grpc-java使用System.nanoTime(),C core在Linux上使用CLOCK_MONOTONIC。
如果截止日期已过,则可能不会发送RPC。 gRPC不提供“即发即忘”的RPC。