GRPC服务端推流异常

Netty + Goole Protobuf报错:Protocol message contained an invalid tag (zero). 参考文章:http://www.starmcu.com/archives/645 在客户端和服务端的Initializer里要注意顺序: ProtobufEncoder要放在ProtobufVarint32LengthFieldPrepender后面。 public class MySixthClientInitializer extends ChannelInitializer<Socke... 阅读详情

现象

  • 日志发生以下异常
    - INTERNAL: Connection closed after GOAWAY. HTTP/2 error code: INTERNAL_ERROR, debug data: Stream 5 sent too many headers EOS: false
    - INTERNAL: Invalid protobuf byte sequence
    		While parsing a protocol message, the input ended unexpectedly in the middle of a field.  This could mean either that the input has been truncated or that an embedded message misreported its own length.
    		iii. Protocol message contained an invalid tag (zero).
    

异常原因及解决方案:

原因

多线程同时向stream的observer句柄写数据,造成数据异常。

解决方案

observer加一个包装类,推送消息时使用包装类的推送方法,推送方法内加锁,使数据流能够顺序发送。类似于:

 public static class ObserverWrapper {
        @Getter
        private final String account;
        @Getter
        private final StreamObserver<Response> observer;

        private static final ReentrantLock LOCK = new ReentrantLock();

        public ObserverWrapper (String account, StreamObserver<Response> observer) {
            this.account = account;
            this.observer = observer;

            ((ServerCallStreamObserver) observer).setOnCancelHandler(() -> {
                LOG.error("通道关闭: {}", observer);
            });
        }

        public void sendMsg(List<Msg> list) {

            if (list== null || list.isEmpty()) {
                LOG.warn("推送信息为空......");
                return;
            }
            LOCK.lock();
            try {
                Response response = Response.newBuilder()
                        .addMsgs(list).build();
                this.observer.onNext(response);

                LOG.debug("向客户端: {}  信息成功: {}", account, list);
            } catch (Exception e) {
                LOG.error("发送消息异常", e);
            } finally {
                LOCK.unlock();
            }
        }
    }
java版gRPC实战之四:客户端流 } 双击下图红框中的task即可生成java代码: 生成下图红框中的文件: 接下来开发服务端; 开发服务端应用 在父工程grpc-turtorials下面新建名为client-stream-server-side的模块,其build.gradle内容如下: // 使用springboot插件 plugins { id ‘org.springframework.boot’ } dependencies { implementation ‘org.projectlombok:lombok’ 阅读详情

相关推荐

GEOS-Chem笔记——模式下载安装+驱动数据+运行流程

看过我博客的会发现我写了很多CESM的笔记,但是说实话,平时科研我其实更多时候是GEOS-Chemuser。之所以写了很多CESM笔记,其实是因为不会,就边学边写。然后GEOS-Chem已经用比较熟了,所以也没想过做笔记啥的。但是我发现越来越多朋友私信我各种CESM问题,我觉得我可能给大家营造了一种我是CESM达人的错觉。感觉自己有点跑偏了呢。公平起见,我觉得我有必要补充点GEOS-Chem笔记。 GEOS-Chem是研究大气化学的人常用的大气化学传输模式,在全世界范围的大气化学研究组中被广泛使用。不过.

砍柴姑娘Jourosy的博客 1万+

Java:gRPC中如何使用json格式的报文发起RPC调用

gRPC中如何使用json格式的报文发起RPC调用

netyeaxi的专栏 4289

Docker “docker login“ 失败? 登录阿里云镜像仓库仓库 unauthorized: authentication required

文章目录听说你 login fail?来,让我们解决一下!登录,撒花 听说你 login fail? 美滋滋的在服务器上安装完成Docker应用,开始配置阿里云镜像加速?然后被阿里云官方文档蹂躏?别急别急,让我来拯救你。 我们先来看看 阿里云官方文档 Docker镜像基本操作: 好家伙,emmm… 上来直接就Login Succeeded,这不简直so easy?我们也来照着操作操作: docker@default-online:~$ docker login registry.cn-hangzhou.a

zhuzicc的博客 1万+

Protocol message contained an invalid tag (zero) 【解决】

java.lang.RuntimeException: Reading from a byte array threw an IOException (should never happen). at io.protostuff.IOUtil.mergeFrom(IOUtil.java:54) at io.protostuff.ProtostuffIOUtil.mergeFrom(Protos...

jackson的博客 1万+

从无人机到机械臂:深入聊聊LQR和LQG在实际项目里的那些‘坑’与最佳实践

本文深入探讨了LQR和LQG在无人机和机械臂等实际项目中的应用挑战与最佳实践。从系统建模的妥协艺术到调参的系统化方法,再到离散化的细节处理,文章分享了工程实践中的宝贵经验。特别强调了如何应对传感器噪声、未建模动态等现实问题,并提供了实用的调试工具和诊断流程,帮助工程师避免常见陷阱,提升控制系统的稳定性和性能。

weixin_28683391的博客 386

Android音频学习(一)——音频基础

在系统的学习Android音频之前,先了解音频的基础知识。

miemie2014的博客 1484

python client 与 java netty server , 用protobuf通讯的问题

此时如果客户端也是netty,那么通讯没有问题,但如果是非java语言,那么如果直接发送/接受protobuf序列化后的二进制包,会报以下异常: io.netty.handler.codec.DecoderException: com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an inva...

qq_39150073的博客 2286

ISMN数据处理

可批量下载,十分方便

m0_46268055的博客 1216

SQL:解决PostgreSQL数据库传输出现ERROR: invalid byte sequence for encoding “UTF8“: 0xe5 0x9b 0x20

解决PostgreSQL数据库传输出现ERROR: invalid byte sequence for encoding “UTF8“: 0xe5 0x9b 0x20

KaiSarH 1万+

[Dify实战]插件编写- 如何让插件直接输出文件对象(支持 TXT、Excel 等)

本文介绍了在Dify插件中实现文件对象返回的方法。通过create_blob_message()函数,开发者可以输出txt、Excel等格式文件,让用户直接下载而非复制文本。文章详细讲解了二进制文件生成的原理,提供了文本翻译和Excel报表生成的代码示例,并列出常见MIME类型对照表。这种技术能显著提升插件实用性,特别适用于翻译、报表生成等需要文件输出的场景,使交互体验从"复制粘贴"升级为"一键下载"。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1249

【python股票价格预测】基于CNN-LSTM的股票价格预测(附python代码)

【python股票价格预测】基于CNN-LSTM的股票价格预测(附python代码)

k8291121的博客 2008

【gRPC】5—gRPC常见异常类型与分析

本篇文章主要梳理gRPC常见异常类型与异常case分析

一棵灬大树的博客 3474

ThingsBoard PE专业版解决方案技术文档——温度&湿度

温湿度解决方案

weixin_67440240的博客 819

如何在ASP.NET Core中正确实现gRPC服务端流?90%开发者忽略的3个陷阱

掌握ASP.NET Core与gRPC的服务端流式通信(Protobuf 3.25),解决高并发实时数据推送难题。详解服务契约定义、流式响应实现及客户端异步处理,规避序列化错误与连接超时陷阱。提升系统性能,值得收藏。

CodeWhim的博客 986

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

gRPC请求超时和异常处理

在 HTTP 请求中,我们发送请求的时候,可以设置一个请求超时时间-connectTimeout,即在指定的时间内,如果请求没有到达服务端,为了避免客户端一直进行不必要的等待,就会抛出一个请求超时异常。我们之前写过一个登录的案例,在之前的案例中,如果用户在登录时输入了错误的用户名密码的话,那么我们是通过一个普通的数据流返回异常信息,其实,对于异常信息,我们可以通过专门的异常通道来写回到客户端。但是在微服务系统中,我们却很少设置请求超时时间,一般都是用另外一个概念代替,那就是请求截止时间。

江南一点雨的专栏 5017

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

手把手教你用ASP.NET Core实现gRPC服务端流(Protobuf 3.25语法全解析)

掌握ASP.NET Core与gRPC的服务端流式通信(Protobuf 3.25),实现高效实时数据推送。详解.proto文件定义、服务端流逻辑及客户端异步接收,适用于日志推送、实时通知等场景。性能高、开发便捷,值得收藏。

FastDebug的博客 1062

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

gRPC 异常处理

最近第一次使用 gRPC 创建一个服务,在服务端我想将一个自定义异常直接抛出去,让客户端能看到。一开始,我这样尝试: // responseObserver.onError(new CustomException("custom exception")); throw new CustomException("one error occurs"); 可是得到了很尴尬...

jiaobuchong的专栏 9584

SpringBoot gRPC同步异常处理

gRPC服务端的业务异常需要透传到gRPC客户端,客户端的根据业务异常展现给用户

眉宇下的小格调 1690

【gRPC】1—gRPC是什么

想要理解好gRPC必须了解HTTP/2协议,因为不论是日常看到的异常栈还是gRPC涉及的相关定义都跟HTTP/2存在强绑定的关系。关于HTTP/2详细介绍请参见:https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-CN。

一棵灬大树的博客 1705

gRPC服务端

这里使用了 `grpc.server` 创建一个 gRPC 服务器,并通过 `add_insecure_port` 指定服务器的监听地址和端口。1. 导入所需的 gRPC 模块和生成的 gRPC 服务文件。例如,你可能需要导入 `grpc` 和自动生成的 `_pb2`、`_pb2_grpc` 模块。这里的 `YourServiceServicer` 是根据你的服务名生成的服务类名,`YourMethod` 是你的服务中的具体方法。3. 启动 gRPC 服务器,并将实现的服务类注册到服务器上。

spekerrr的博客 630

gRPC全局异常捕获

gRPC全局异常捕获 引 一般的.net项目比如ASP.NET、控制台程序、Windows服务、桌面程序等都会有framework自带的全局异常捕获机制。ASP.NET的ExceptionFilterAttribute,控制台和Windos服务的AppDomain.CurrentDomain.UnhandledException。那么gRPC的异常捕获是如何实现的。 思路 首先来说一下我...

banchi3271的专栏 1154

gRPC Stream

gRPC Stream Stream 在 gRPC 中代表一个真正的请求,包含要发送的 消息;Stream 分为 ClientStream 和 ServerStream ClientStream ClientStream 接口继承 Stream 接口,有多个实现类或抽象实现类: ForwardingClientStream: 用于转发的 ClientStream,支持代理真正的流,可以用于触发一些动作,如统计等 NoopClientStream: 不做任何操作的 ClientStream,用于空实现

啦啦啦啦 la 2986

如何用ASP.NET Core打造低延迟流式API?gRPC服务端流实战解析

掌握ASP.NET Core与gRPC的服务端流式通信,构建低延迟、高并发的实时API。适用于日志推送、实时通知等场景,通过ProtoBuf高效序列化,提升传输性能。详解服务定义与客户端消费流程,值得收藏。

GatherTide的博客 691
上一篇: PVE启动卡在loading initial ramdisk
下一篇: spring中logback日志使用pid作为日志文件夹,用以区分进程日志
雕花の刺猬
博客等级 码龄10年 45粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值