Solon v4.1.1

Solon Rpc 超时和心跳控制

</> markdown
2026年9月14日 上午5:16:42

超时是调用的保护边界;心跳是长连接存活检测。

1、请求超时的控制(对 http、socket、websocket 通道都有效)

  • 使用注解控制 timeout (单位:秒)
//在接口使用时配置
@NamiClient(name = "userapi",  path="/rpc/v1/user", timeout=60*5)
UserService userService;

//或者 

//在接口声明时配置
@NamiClient(name = "userapi",  path="/rpc/v1/user", timeout=60*5)
public class UserService{
   //..
}
  • 使用构建器
UserService userService = Nami.builder().name("userapi").path("/rpc/v1/user")
                                       .timeout(60*5)
                                       .decoder(SnackDecoder.instance)
                                       .encoder(SnackTypeEncoder.instance)
                                       .create(UserService.class);
  • 使用全局配置(会对全局有影响,使用时注意)
@Configuration
public class Config {
    @Bean
    public NamiConfiguration initNami(){
        return new NamiConfiguration() {
            @Override
            public void config(NamiClient client, NamiBuilder builder) {
                builder.timeout(60*5);
                builder.decoder(SnackDecoder.instance);
                builder.encoder(SnackTypeEncoder.instance);
            }
        };
    }
}

2、心跳间隔控制(仅对 socket、websocket 长链接通道有效)

  • 使用注解控制 heartbeat (单位:少)
@NamiClient(name = "userapi",  path="/rpc/v1/user", heartbeat=30);
UserService userService;
  • 使用构建器
UserService userService = Nami.builder().name("userapi").path("/rpc/v1/user")
                                       .heartbeat(30)
                                       .decoder(SnackDecoder.instance)
                                       .encoder(SnackTypeEncoder.instance)
                                       .create(UserService.class);
  • 使用全局配置(会对全局有影响,使用时注意)
@Configuration
public class Config {
    @Bean
    public NamiConfiguration initNami(){
        return new NamiConfiguration() {
            @Override
            public void config(NamiClient client, NamiBuilder builder) {
                builder.heartbeat(30)
                builder.decoder(SnackDecoder.instance);
                builder.encoder(SnackTypeEncoder.instance);
            }
        };
    }
}

3、 超时后的业务处理

超时不等于服务端一定没有执行:请求可能已经到达服务端,只是响应没及时回来。因此:

  • 查询可以在确认幂等后有限重试。
  • 新增、扣款、发货等写操作不要盲目重试。
  • 需要重试时使用业务幂等键,并在服务端去重。
  • 记录调用目标、接口、耗时和 traceId,不要记录敏感请求头。