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服务器对长寿命流的有效实现
- 获取数字的最后一位 2022-01-01
- 未找到/usr/local/lib 中的库 2022-01-01
- 如何使 JFrame 背景和 JPanel 透明且仅显示图像 2022-01-01
- GC_FOR_ALLOC 是否更“严重"?在调查内存使用情况时? 2022-01-01
- 如何指定 CORS 的响应标头? 2022-01-01
- Eclipse 的最佳 XML 编辑器 2022-01-01
- java.lang.IllegalStateException:Bean 名称“类别"的 BindingResult 和普通目标对象都不能用作请求属性 2022-01-01
- 将 Java Swing 桌面应用程序国际化的最佳实践是什么? 2022-01-01
- 在 Java 中,如何将 String 转换为 char 或将 char 转换 2022-01-01
- 转换 ldap 日期 2022-01-01