Java gRPC 服务器用于长寿命流的有效实现

2024-04-07

我想了解 gRPC 框架的一部分,用于长期流的资源管理。 假设我们有无限的罕见(每秒一次左右)事件源,我们希望通过 grpc 流的方式将其流式传输到客户端。 这些事件由服务器上的单个应用程序线程生成。

我看到两种可能的流事件实现:

  1. 在 rpc 调用中旋转调用者线程并通过(阻塞)队列与源通信
  2. 将 StreamObserver 暴露给事件生成线程并从那里填充所有客户端流。

选项一看起来很简单,但线程数有点重 - 每个客户端一个线程用于稀疏流似乎有点大材小用。每个线程都需要一些堆占用调度程序等等。

选项二看起来更加资源友好。但是我在互联网上找不到任何材料来支持这种方法。我不确定 gRPC 服务器不会意外关闭 ServerCall 或 Context,从而导致流突然关闭。或者可能还有一些我不知道的其他副作用。

所以我的问题是: 实现长期流的推荐方法是什么? 是否有任何其他可能的方法来解决所描述的问题。 选项 2 是否合法,还是应该坚持使用 1 个客户端 1 个线程的方法?

我尝试用选项二创建一个原型,它似乎有效。 但我还是想得到答案。


从 gRPC 的角度来看,这两种方法都很好。如果方便的话,您可以自由地坚持使用 1 个客户端、1 个线程的方法。对于流传输情况,通常最好避免在调用者线程中旋转,但您可以使用第二个线程来发送;这很正常。另一方面,通过StreamObserver使用单个线程进行管理具有资源优势,也是一个很好的方法。

当事件生成速度快于发送速度时,您应该考虑如何响应缓慢的客户端(即流量控制)。

您将需要投射提供的StreamObserver to ServerCallStreamObserver访问其他 API。它提供setOnReadyHandler(Runnable) https://grpc.github.io/grpc-java/javadoc/io/grpc/stub/CallStreamObserver.html#setOnReadyHandler-java.lang.Runnable- and isReady() https://grpc.github.io/grpc-java/javadoc/io/grpc/stub/CallStreamObserver.html#isReady--用于检测速度慢的客户端。 gRPC Java 允许您调用onNext(...)即使没有准备好,但这样做会缓冲。

就绪处理程序是一个回调,它使用与调用者线程相同的线程,因此如果您在调用者线程中旋转,您将无法接收该回调。这就是为什么对于流式传输来说,通常最好避免在调用者线程中旋转。

使用专用的发送线程具有清晰的队列以及生产者和消费者之间分离的优点。您可以选择队列大小并决定队列已满时要执行的操作。直接与StreamObserver一个线程中的 s 资源使用量较少。两个选项的复杂性各不相同。 “正确”的方法选择基于规模、资源考虑、服务的具体情况以及您的偏好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java gRPC 服务器用于长寿命流的有效实现 的相关文章

随机推荐

  • Git:父提交比后代提交年轻?

    我正在浏览http arago project org git projects linux omap3 git http arago project org git projects linux omap3 gitrepo 并遇到了一个奇
  • MASM0015; Web服务HandlerTubeFactory异常

    我正在尝试创建一个可以调用另一个的网络服务链 我已经创建了第一个服务并成功部署在 weblogic12c 上 当第一个 Web 服务尝试调用外部 Web 服务时 出现以下异常 notifyAbout WSTestOuter outer ne
  • 使用 javascript 加载部分 html

    在我的网站上 我加载在服务器 nodejs 上呈现的 html 并将其插入到正确的位置 大多数情况下是带有 id 内容的 div 如何在客户端插入接收到的 html 以便执行包含的脚本标记 我在客户端使用下划线和把手 但 vanillajs
  • 为什么GK110有192个核心和4个扭曲?

    我想感受一下开普勒的架构 但这对我来说没有意义 如果一个 warp 有 32 个线程 其中 4 个被调度 执行 则意味着 128 个核心正在使用 64 个核心处于空闲状态 白皮书中提到了独立指令 那么64核是为这些指令保留的吗 如果是这样
  • 如何从此类图像中删除背景?

    我想删除该图像的背景以仅获取人物 我有数千张这样的图像 基本上是一个人和一个有点发白的背景 我所做的是使用边缘检测器 例如 canny 边缘检测器或索贝尔滤波器 来自skimage图书馆 然后我认为可以做的是 将边缘内的像素变白 并将边缘外
  • 如何在 React + Babel 中允许异步函数?

    我有一个 Typescript React 应用程序 它可以使用 then catch Promise 执行异步函数 但不能使用 async await try catch 执行异步函数 错误是 Uncaught ReferenceErro
  • 使用 Visual Studio 查找 C++ 应用程序中的内存泄漏

    在Linux中 我一直使用valgrind来检查应用程序中是否存在内存泄漏 Windows 中的等效项是什么 这可以用 Visual Studio 2010 来完成吗 Visual Studio 2019 有一个不错的内存分析工具 它可以在
  • jpql“加入获取”与 EntityGraph

    我想使用 jpql 或 jpa 实体图加载相关实体 看起来两者都做同样的事情 我为什么要使用实体图而不是普通的jpql 有什么好处吗 使用jpql有什么区别 select distinct u from User u join fetch
  • 无法从“node_modules\react-native-gesture-handler\createHandler.js”解析“fbjs/lib/areEqual”

    我正在使用 expo 构建一个反应本机应用程序 但是 我有一个错误 因此我无法继续构建该应用程序 我什至在错误消息中提到的node modules 中查找了文件 我正在使用 React native gesture handler 进行屏幕
  • 快速引导大量分层数据的策略以及在任何记录发生更改时更新 Elasticsearch 中的单个分层 json 文档的方法

    根据业务场景 来自 2 个关系表 最好是多个表 例如 6 7 的列必须合并到单个分层 json 文档中 以用于 Elasticsearch 上的单个索引 如下面示例文档中所述 样本文件 员工及联系信息 id 1 name tom john
  • 如何在 TypeORM 查找选项中设置 IS NULL 条件?

    在我的查询中我使用 TypeORMfind选项 我怎样才能拥有IS NULL条件在where clause 如果有人正在寻找 NOT NULL 它会是这样的 import IsNull Not from typeorm return awa
  • AWS CloudWatch 未使用的自定义指标保留和定价 - 2018 年

    如果我理解正确的话 自定义指标似乎将保留 15 个月 因为根据数据 它们会聚合为更高分辨率https aws amazon com cloudwatch faqs https aws amazon com cloudwatch faqs 这
  • 正则表达式匹配未完成

    我曾经有过一次回答了一个问题 https stackoverflow com a 17723854 882200关于将带引号的字符串与转义引号匹配 似乎有些情况会在 NET 上挂起并在 Mono 上崩溃 带有OutOfMemoryExcep
  • 使用描述符进行类型提示

    In 这个拉取请求 https github com python mypy pull 2266看起来添加了对描述符的类型提示支持 然而 似乎没有发布最终的 正确 用法示例 也没有添加任何文档到typing module https doc
  • C# htmlagilitypack,捕获重定向

    大家好 这真的很简单 我希望 我正在使用 htmlagility pack 进行网络爬虫 那么 如果我输入 url 然后将我定向到新的 url 会发生什么情况 如何捕获该新的重定向 URL 如果 htmlagilitypack 没有办法 有
  • 登录 GCP 和本地

    我正在构建一个旨在在 Google Cloud Platform 中的虚拟机上运行的系统 但是 作为一种备份形式 它也可以在本地运行 话虽这么说 我目前的问题是日志记录 我有两个记录器 都可以工作 一个本地记录器和一个云记录器 云记录器 i
  • 在 FTP 上上传文件

    我想将文件从一台服务器上传到另一台 FTP 服务器 以下是我上传文件的代码 但它抛出错误 远程服务器返回错误 550 文件不可用 例如 未找到文件 无法访问 这是我的代码 string CompleteDPath ftp URL strin
  • 使用贝叶斯优化的深度学习结构的超参数优化

    我为原始信号分类任务构建了 CLDNN 卷积 LSTM 深度神经网络 结构 每个训练周期运行约 90 秒 超参数似乎很难优化 我一直在研究优化超参数的各种方法 例如随机或网格搜索 并发现了贝叶斯优化 虽然我还没有完全理解优化算法 但我认为它
  • Keras model.fit log 和 Sklearn.metrics.confusion_matrix 报告的验证准确性指标彼此不匹配

    问题是报道的validation accuracy我从 Keras 获得的价值model fit历史显着高于validation accuracy我得到的指标sklearn metrics功能 我得到的结果model fit总结如下 Las
  • Java gRPC 服务器用于长寿命流的有效实现

    我想了解 gRPC 框架的一部分 用于长期流的资源管理 假设我们有无限的罕见 每秒一次左右 事件源 我们希望通过 grpc 流的方式将其流式传输到客户端 这些事件由服务器上的单个应用程序线程生成 我看到两种可能的流事件实现 在 rpc 调用