能否给一个 volo-grpc 热重启 配合 graceful_shutdown 的代码案例 · Issue #599 · cloudwego/volo · GitHub
Skip to content

能否给一个 volo-grpc 热重启 配合 graceful_shutdown 的代码案例 #599

Open

Description

@i18nsite

热重启
https://www.cloudwego.io/zh/blog/2023/08/28/volo-0.5.4-%E7%89%88%E6%9C%AC%E5%8F%91%E5%B8%83/#how-to-1

graceful shutdown
https://www.cloudwego.io/zh/blog/2023/02/07/volo-0.3.2-%E7%89%88%E6%9C%AC%E5%8F%91%E5%B8%83/#grpc-graceful-shutdown-%E6%94%AF%E6%8C%81

我比较困惑的点是
1、热重启应该是让多个进程监听一个端口,怎么配合volo-grpc使用呢?
2、我替换二进制文件之后,是kill -HUP $(cat /var/run/xxx.pid)来进行热重启吗?

Activity

  1. PureWhiteWu commented on Jul 15, 2025

    @PureWhiteWu
    Contributor

    你好,在 Server 启动(run)前初始化 hotrestart 即可,code example:

    #[tokio::main]
    async fn main() {
        let addr: SocketAddr = "[::]:8080".parse().unwrap();
        // test uds case
        // let addr: &Path  = Path::new("/tmp/volo_server.sock");
        // let addr = Cow::from(addr);
    
        // hotrestart initialize
        volo::hotrestart::DEFAULT_HOT_RESTART
            .initialize(Path::new("/tmp"), 1)
            .await
            .unwrap();
    
        volo_gen::xxx::XServiceServer::new(S)
            .run(addr)
            .await
            .unwrap();
    }

    注意事项:

    1. 热升级的使用一般需要有个托管进程来负责二进制更新和启动等;
    2. initialize 方法两个参数:
    • sock_dir_path: 存储 hot_restart 使用的 UDS 监听地址父目录,一般由托管进程分配地址;
    • server_listener_num: 总共 server 监听数量,指启动的基于 volo 的 server listener 数量,一般服务只有一个 server,设置 1 即可;
  2. i18nsite commented on Jul 24, 2025

    @i18nsite
    ContributorAuthor

    @PureWhiteWu
    我还有一个困惑,
    比如说我grpc返回一个响应流。
    这里的热重启是会等待所有的sender被drop,还是不等这个,我需要手动阻塞请求等sender被drop吗?

  3. PureWhiteWu commented on Jul 24, 2025

    @PureWhiteWu
    Contributor

    会等,Thrift 框架会有个上限时间,gRPC 得去看一下实现代码

  4. i18nsite commented on Jul 25, 2025

    @i18nsite
    ContributorAuthor

    会等,Thrift 框架会有个上限时间,gRPC 得去看一下实现代码

    最好有个文档, 比如如何设置时间上限,因为可能有的流任务会比较耗时

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions