发现Ray实现节点之间对象传输用的是Pull+Push的模式,也就是说,传输一个对象用了两次RPC调用,object_manager.proto可以很直观地体现这一点(服务定义如下,其中PullReply和PushReply都是空消息体)。不清楚这个过程为什么不设计成一次RPC调用,即参数是对象ID,返回值是对象,底层用异步gRPC也并不需要阻塞等待
service ObjectManagerService { // Push service used to send object chunks rpc Push(PushRequest) returns (PushReply); // Try to pull object from remote object manager rpc Pull(PullRequest) returns (PullReply); }
首先再处理大 object 的时候必然不可能在 reply 里面带上完整的数据,这样不仅内存控制不住,grpc 对 request/reply 也是有上限的,所以我理解我们需要讨论的应该是:
ps: 说到这里,你就会发现,rpc调用次数从 n+1 变成 n 了,只是说当 n 很小的时候,这个优化比例会很高
按照我个人的理解,我们没有采用后者的主要原因在于,ray 目前的设计, pull 端是会重试的,目前的策略是发现间隔时间内 object 没有完成,则随机选择一个有数据的节点 pull 数据,在这种情况下,如果选用后者,那 rpc request 会增加 n,目前则是 1