V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
0576coder
V2EX  ›  程序员

这样的一段 grpc 客户端代码处理服务端流会不会有问题,或者有没有更优雅的实现方式

  •  
  •   0576coder · 2021-08-19 16:26:03 +08:00 · 1240 次点击
    这是一个创建于 1226 天前的主题,其中的信息可能已经有所发展或是发生改变。
    public class gRPCWatcher {
    
        /**
         * grpc channel
         */
        private final gRPCChannel gRPCChannel;
    
        /**
         * 当前重连的次数
         */
        private int hasReconnectTimes = 0;
    
        /**
         * 最大重连次数
         */
        private final int maxReconnectTimes = 3;
    
        /**
         * 构造函数
         */
        public gRPCWatcher(gRPCChannel gRPCChannel) {
            this.gRPCChannel = gRPCChannel;
        }
    
        public void startWatch(Request confRequest, WatchHandler watchHandler) {
            StreamObserver<ConfResponse> streamObserver = new StreamObserver<ConfResponse>() {
                @Override
                public void onNext(ConfResponse confResponse) {
                    try {
                        watchHandler.process(confResponse);
                    } catch (Exception e) {
                        //...
                    }
                    hasReconnectTimes = 0;
                }
    
                @Override
                public void onError(Throwable throwable) {
                    //error 的时候尝试重新调用,超过最大次数失败抛出异常
                    if (hasReconnectTimes < maxReconnectTimes) {
                        hasReconnectTimes++;
                        startWatch(confRequest, watchHandler);
                    } else {
                        throw new RuntimeException("reWatch "+maxReconnectTimes+" times still error" + throwable.getMessage());
                    }
                }
    
                @Override
                public void onCompleted() {
                    //...
                }
            };
            ConfigGrpc.newStub(gRPCChannel.getNettyChannel()).withWaitForReady().watch(confRequest, streamObserver);
        }
    }
    

    这是一段处理服务端流的 grpc 调用的逻辑,当网络出问题等异常情况的时候,会进入 onError, grpc channel 底层自带重连重试机制,所以我们只要重新 stub call 就行了。

    所以我在 onError 的时候重新调用该方法,为了防止无限调,所以加了以这个最大重试次数,不知道这样写优雅不优雅- -

    关于 grpc 的重连 可以看官方的讨论,他们也是推荐 channel 可以复用 主要 stub 重新 call https://groups.google.com/g/grpc-io/c/quToVM4NhdQ

    3 条回复    2021-08-21 15:05:35 +08:00
    0576coder
        1
    0576coder  
    OP
       2021-08-19 22:44:59 +08:00
    you 老哥指点一下么- -
    yidongnan
        2
    yidongnan  
       2021-08-20 15:09:38 +08:00
    0576coder
        3
    0576coder  
    OP
       2021-08-21 15:05:35 +08:00
    @yidongnan
    假如我不用 springboot 呢- - 肯定只依赖 grpc-java 好- -
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2789 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:02 · PVG 15:02 · LAX 23:02 · JFK 02:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.