我正在为GRPC实现一个自定义负载均衡器,以在我的应用程序中启用客户端负载均衡。由于业务需求,我需要在负载平衡算法中使用基于响应时间的度量。
问题是,用于在负载均衡器中选择子通道的GRPC Picker接口没有任何在请求处理后调用的回调。所以我不能测量Picker中的执行时间。为了绕过这一点,我尝试使用客户端拦截器来测量RPC的确切时间,但是拦截器似乎没有任何关于作为负载平衡结果而选择的服务器地址的信息。
在GRPC中,有没有其他机制可以将负载平衡与测量RPC响应时间结合起来?
发布于 2021-10-13 19:00:44
需要注意的一件事是,C-core内部的LB策略接口目前不是公共API。它不是一个稳定的应用程序接口,并且很可能会在不同的版本中发生变化,所以如果您实现了自己的LB策略,那么当您升级gRPC时,您很可能需要进行更改以使其正常工作。我们希望最终提供一个公共的、稳定的LB策略API,但在完成EventEngine工作之前,我们无法做到这一点,因为当前(糟糕的)轮询API直接暴露于LB策略。即使一旦发生这种情况,我们也可能决定在稳定当前API之前对其进行一些结构上的改变。
注意,在我们当前的实现中,LB策略实际上可以在调用完成时获得回调。他们可以通过让选择器返回一个recv_trailing_metadata_ready回调来做到这一点。通道将在调用完成时调用该回调。请注意,通道不会为此回调提供任何同步;它不会在WorkSerializer (用于所有LB策略控制平面操作)中调用,也不会在数据平面互斥锁(在调用选择器时保持)中调用,因此LB策略实现必须在回调中进行自己的同步。此外,目前可能有一些边缘情况,当pick结果被丢弃时,回调不会被调用,但这是我们无论如何都需要解决的问题,所以如果你遇到它,请提交相关问题。
我希望这些信息能对你有所帮助!
https://stackoverflow.com/questions/69546857
复制相似问题