Java gRPC server for long-lived streams effective implementation(Java GRPC服务器对长寿命流的有效实现)
问题描述
我想了解GRPC框架的一部分,用于长期流的资源管理。 假设我们有无限的罕见事件源(大约每秒一次),我们希望通过GRPC流的方式将这些事件流到客户端。 这些事件由服务器上的单个应用程序线程生成。
我看到两种可能的事件流实现:
- 在RPC调用中调入调用者线程,并通过(阻塞)队列与源进行通信
- 向事件生成线程公开StreamWatch,并从那里填充所有客户端流。
所以我的问题是: 推荐的实现长寿命流的方法是什么? 是否有任何其他可能的方法来实现所描述的问题。 选项2是合法的,还是应该坚持使用1个客户端1线程方法?
我尝试使用选项2创建一个原型,它似乎起作用了。 但我仍然希望得到答案。
推荐答案
从GRPC的角度来看,这两种方法都很好。在方便的时候,您可以自由地使用一个客户端、一个线程的方法。对于流的情况,通常最好避免在调用方线程中旋转,但您可以使用第二个线程来发送;这是很正常的。另一方面,将StreamObserver
传递给单个线程进行管理会带来资源上的好处,也是一种很好的方法。
当生成事件的速度快于发送事件的速度(即,流控制)时,您应该考虑如何响应速度较慢的客户端。
您需要将提供的StreamObserver
转换为ServerCallStreamObserver
以访问其他接口。提供检测慢客户端的setOnReadyHandler(Runnable)
和isReady()
。GRPC Java允许您在尚未准备好的情况下调用onNext(...)
,但这样做将会缓冲。
StreamObserver
交互会占用较少的资源。这两种选择的复杂程度各不相同。选择正确的方法取决于规模、资源考虑因素、服务细节和您的首选项。
这篇关于Java GRPC服务器对长寿命流的有效实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java GRPC服务器对长寿命流的有效实现
基础教程推荐
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01