如何在 gRPC 异步服务中使用共享完成队列

Posted

技术标签:

【中文标题】如何在 gRPC 异步服务中使用共享完成队列【英文标题】:How to use shared completion queue in gRPC asynchronous service 【发布时间】:2020-08-23 21:43:53 【问题描述】:

您好,我正在尝试实现 DBMS 多线程 gRPC 异步服务。现在我坚持使用共享完成队列。我最初保存每个线程启动的 RPC 调用的标签,并根据 cq.Next() 的 rpc 调用返回检查标签,以确保我有正确的线程来检查回复。但是,我从Confusion around CompletionQueue in an async C++ client 发现每个标签只会从 cq 中出来一次。我想知道让多个线程共享同一个 cq 的最佳方法是什么?我希望每个线程能够只处理它启动的 RPC 调用,并且我不希望一个线程等待另一个线程创建的 RPC。这可能吗?怎么做?有没有办法遍历队列,只删除带有匹配标签的 RPC?我没有从之前的 *** 帖子中看到明确的解决方案。

【问题讨论】:

【参考方案1】:

我认为completion queuethread 可以有两种常用方法

    多个completion queue和多个threads,每个completion queue用于一个RPC,一个thread专注于一个completion queue 一个completion queue和多个threads,每个thread调用completion_queue.Next()

但如果你想让它们混合,这意味着你需要添加另一个middleware 来将事件分配给特定线程。例如,初始化工作时,将tag记录在一个map中,调用cq.Next()时,可以查看map找到目标thread。但我找不到这种方式的任何好处。

【讨论】:

以上是关于如何在 gRPC 异步服务中使用共享完成队列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用异步 GRPC 调用有效地管理内存

gRPC-微服务间通信实践

grpc 完成异步 java 服务请求/响应映射

Zookeeper概述

异步队列,文件流结束如何知道两者何时完成

异步队列,文件流结束如何知道两者何时完成