从多线程客户端调用 grpc 服务器
Calling grpc server from multi-threaded client
我有一个客户端代码,是多线程的,调用updateInfo
rpc方法到grpc服务器更新信息(最终会更新SQL中的数据)。
我认为有两种方法可以从客户端调用 updateInfo
rpc 服务器:
- 将更新的数据缓存到每个客户端线程的内存中,然后轮询调用
updateInfo
rpc 服务器,该服务器迭代客户端线程并从每个线程的缓存中更新数据。
- 每个客户端线程直接调用
updateInfo
rpc 服务器。
我的问题是:
- 多线程客户端可以同时调用
updateInfo
rpc服务器吗?如果为 true,那么如果服务器不能足够快地处理来自客户端的请求,rpc 服务器端将对来自客户端的请求进行排队?
- 即使rpc服务器端可以同时处理来自客户端的多个调用,使用第一种方法缓存有什么优势吗?
gRPC 支持同时请求client-side和server-side,在不同的线程中处理。这就是 out-of-box 的体验。可能会出现排队的点,但比“多于一个RPC”要高很多。
因此,如果您的每个线程都调用 updateInfo
,那么它们可能会在 server-side 上并发处理。第一个或第二个选项是否有优势更多是您的应用程序架构的问题;选项 1 在客户端执行一些同步,这减少了服务器需要做的工作。您想要哪个组件来完成这项工作?在这两个选项之间做出决定是 application-level 架构优化决策。 (这里的优化不仅仅是优化 CPU,还有代码复杂性,谁在为资源买单,以及扩展。)对于许多应用程序来说,决定可能与涉及的规模无关,所以选项 2 可能更好,因为客户端实现更简单,服务端实现难度相同。
我有一个客户端代码,是多线程的,调用updateInfo
rpc方法到grpc服务器更新信息(最终会更新SQL中的数据)。
我认为有两种方法可以从客户端调用 updateInfo
rpc 服务器:
- 将更新的数据缓存到每个客户端线程的内存中,然后轮询调用
updateInfo
rpc 服务器,该服务器迭代客户端线程并从每个线程的缓存中更新数据。 - 每个客户端线程直接调用
updateInfo
rpc 服务器。
我的问题是:
- 多线程客户端可以同时调用
updateInfo
rpc服务器吗?如果为 true,那么如果服务器不能足够快地处理来自客户端的请求,rpc 服务器端将对来自客户端的请求进行排队? - 即使rpc服务器端可以同时处理来自客户端的多个调用,使用第一种方法缓存有什么优势吗?
gRPC 支持同时请求client-side和server-side,在不同的线程中处理。这就是 out-of-box 的体验。可能会出现排队的点,但比“多于一个RPC”要高很多。
因此,如果您的每个线程都调用 updateInfo
,那么它们可能会在 server-side 上并发处理。第一个或第二个选项是否有优势更多是您的应用程序架构的问题;选项 1 在客户端执行一些同步,这减少了服务器需要做的工作。您想要哪个组件来完成这项工作?在这两个选项之间做出决定是 application-level 架构优化决策。 (这里的优化不仅仅是优化 CPU,还有代码复杂性,谁在为资源买单,以及扩展。)对于许多应用程序来说,决定可能与涉及的规模无关,所以选项 2 可能更好,因为客户端实现更简单,服务端实现难度相同。