【发布时间】:2023-01-20 01:45:54
【问题描述】:
我有一个场景,客户端可以通过 GRPC 连接到服务器,我想对其实施背压,这意味着我想接受许多并发请求 10000,但只有 50 个并发线程执行请求(灵感来自Apache Tomcat NIO 接口行为)。我也希望通信是异步的,以一种反应方式,这意味着客户端发送请求但不等待它,服务器稍后发送响应,然后客户端执行一些注册要执行的功能。
我怎样才能在 GO GRPC 中做到这一点?我应该使用流吗?有没有例子?
【问题讨论】:
我有一个场景,客户端可以通过 GRPC 连接到服务器,我想对其实施背压,这意味着我想接受许多并发请求 10000,但只有 50 个并发线程执行请求(灵感来自Apache Tomcat NIO 接口行为)。我也希望通信是异步的,以一种反应方式,这意味着客户端发送请求但不等待它,服务器稍后发送响应,然后客户端执行一些注册要执行的功能。
我怎样才能在 GO GRPC 中做到这一点?我应该使用流吗?有没有例子?
【问题讨论】:
GoLang API 是一个同步 API,这就是 GoLang 通常的工作方式。您在 while true 循环中阻塞,直到事件发生,然后您继续处理该事件。关于让更多线程同时执行请求,我们无法在客户端进行控制。在 gRPC 之上的应用层的客户端,你可以 fork 更多的 Goroutines,每个 Goroutines 执行请求。服务器端已经为每个接受的连接创建了一个 goroutine,甚至在连接上流式传输,因此服务器端已经存在固有的多线程。
【讨论】:
请注意,没有线程在去。去我们使用 goroutines。
所描述的行为已经内置到 GRC 服务器中。例如,see this option。
// NumStreamWorkers returns a ServerOption that sets the number of worker
// goroutines that should be used to process incoming streams. Setting this to
// zero (default) will disable workers and spawn a new goroutine for each
// stream.
//
// # Experimental
//
// Notice: This API is EXPERIMENTAL and may be changed or removed in a
// later release.
func NumStreamWorkers(numServerWorkers uint32) ServerOption {
// TODO: If/when this API gets stabilized (i.e. stream workers become the
// only way streams are processed), change the behavior of the zero value to
// a sane default. Preliminary experiments suggest that a value equal to the
// number of CPUs available is most performant; requires thorough testing.
return newFuncServerOption(func(o *serverOptions) {
o.numServerWorkers = numServerWorkers
})
}
工人们在某个时候initialized。
// initServerWorkers creates worker goroutines and channels to process incoming
// connections to reduce the time spent overall on runtime.morestack.
func (s *Server) initServerWorkers() {
s.serverWorkerChannels = make([]chan *serverWorkerData, s.opts.numServerWorkers)
for i := uint32(0); i < s.opts.numServerWorkers; i++ {
s.serverWorkerChannels[i] = make(chan *serverWorkerData)
go s.serverWorker(s.serverWorkerChannels[i])
}
}
我建议您自己阅读服务器代码,以了解更多信息。
【讨论】: