英文:
How to limit concurrent connections from client in Golang GRPC
问题
我是你的中文翻译助手,以下是翻译好的内容:
我是GRPC的新手。
我有一个任务:
我需要在Golang的GRPC中实现一个服务。
服务包含以下功能:
1)接收来自客户端的图像并保存它们。
2)显示已保存图像的列表。
问题是如何限制来自客户端的并发连接:
下载/保存文件(图像)- 10个并发请求。
获取已保存消息列表- 100个并发请求。
英文:
I'm a newbie in GRPC.
I have a task:
I have to implement a service in Golang GRPC.
Service with functions:
- Accepts image from client and saves them.
- Shows a list of saved images.
Question is how to limit conccurent connections from client:
to download/save files(images) - 10 conccurent requests.
to get list of saved messages - 100 conccurent requests.
答案1
得分: 0
根据您的评论,看起来您只想检查特定RPC函数的进行中调用数量。您可以使用标准的Go功能来实现这一点(相同的方法也适用于任何函数)。例如,将计数器添加到您的服务结构体中:
type Server struct {
// ...
downloadCount atomic.Int32
// ...
}
然后在处理调用时使用该计数器:
func (s *Server) Download(context context.Context, req *pbpkg.DownloadRequest) (*pbpkg.DownloadRequest, error) {
inProgressCount := downloadCount.Add(1)
defer downloadCount.Add(-1) // 完成后减少计数器
if inProgressCount > 10 {
return nil, status.Errorf(codes.ResourceExhausted, "Download limit hit")
}
// 在这里执行操作
}
请注意,我使用了atomic.Int32;还有其他方法(如sync.Mutex、chan等),但重要的是要考虑竞态条件。
我相信还有其他方法(例如:go-concurrency-limits),但通常简单的方法是最好的!
英文:
Base on your comments it looks like you just want to check how many in-progress calls there are to a specific RPC function. You can do this with standard Go functionality (the same approach can be used for any function). For example; as a counter to your service struct:
type Server struct { ...
...
downloadCount atomic.Int32
...
}
Then use that when processing the call:
func (s *Server) Download(context context.Context, *pbpkg.DownloadRequest) (*pbpkg.DownloadRequest, error){
inProgressCount := downloadCount.Add(1)
defer downloadCount.Add(-1) // decrease counter when done
if inProgressCount > 10 {
return nil, status.Errorf(codes.ResourceExhausted, "Download limit hit")
}
// Do stuff here
}
Note that I've used atomic.Int32; there are other approaches (sync.Mutex, chan etc) but it is important that you consider race conditions.
I'm sure there are other approaches (e.g.) but often the simple approach is best!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论