gRPC:我应该为整个应用程序使用一个客户端吗?
gRPC: should I use a single client for the entire application?
我知道 gRPC 团队建议我们在整个应用程序中使用单一通道,这正是我们要做的。但是我们不确定在构造函数上接收此通道的客户端 class。最佳做法是什么:
- 创建客户端的新实例class 每次调用
- 每个线程使用一个客户端实例
- 在整个应用程序中使用单个客户端(与我们在频道中使用的方式相同)
我们有兴趣使用第一种方法,但我们不知道创建客户端的新实例是否也是一个昂贵的操作class。
客户端本质上只是 CallInvoker
的包装器,如果您从 Channel
开始,它将是 DefaultCallInvoker
。 DefaultCallInvoker
也 只是 Channel
的包装器,没有状态或复杂性。客户端和 call-invoker 都没有添加同步之类的东西,因此与新客户端交谈的行为与与共享频道的 pre-existing 客户端交谈的行为相同。
结论:创建一个新客户端并不昂贵/call-invoker,但如果你想削减额外的 2 个分配,你应该能够在没有明显差异的情况下共享客户端。
我知道 gRPC 团队建议我们在整个应用程序中使用单一通道,这正是我们要做的。但是我们不确定在构造函数上接收此通道的客户端 class。最佳做法是什么:
- 创建客户端的新实例class 每次调用
- 每个线程使用一个客户端实例
- 在整个应用程序中使用单个客户端(与我们在频道中使用的方式相同)
我们有兴趣使用第一种方法,但我们不知道创建客户端的新实例是否也是一个昂贵的操作class。
客户端本质上只是 CallInvoker
的包装器,如果您从 Channel
开始,它将是 DefaultCallInvoker
。 DefaultCallInvoker
也 只是 Channel
的包装器,没有状态或复杂性。客户端和 call-invoker 都没有添加同步之类的东西,因此与新客户端交谈的行为与与共享频道的 pre-existing 客户端交谈的行为相同。
结论:创建一个新客户端并不昂贵/call-invoker,但如果你想削减额外的 2 个分配,你应该能够在没有明显差异的情况下共享客户端。