egametang/ET · error · RpcException
service discovery proxy retryable service call error request
Error message
service discovery proxy retryable service call error request: {requestName} sceneType: {sceneTypeName} error: {error} message: {message} What it means
RpcException thrown at line 370 in ServiceDiscoveryProxy.CallBySceneTypeAsync: the resolved target service returned a response whose Error matches ShouldRetryServiceCallError (a retryable failure). The proxy disposes the response and throws so the outer catch increments retryCount and retries (up to ServiceResolveRetryTimes) with WaitResolveRetryDelayAsync. If retries are exhausted the same RpcException propagates.
Source
Thrown at Packages/cn.etetet.servicediscovery/Scripts/Hotfix/Server/ServiceDiscoveryProxySystem.cs:370
if (messageSender == null)
{
throw new Exception($"service discovery proxy message sender is null, request: {requestName} scene: {self.Root().Name}");
}
IResponse rawResponse = await messageSender.Call(actorId, request, needException);
if (rawResponse is not T response)
{
(rawResponse as MessageObject)?.Dispose();
throw new Exception(
$"service discovery proxy service response type mismatch request: {requestName}, actual: {rawResponse?.GetType().Name}");
}
if (ShouldRetryServiceCallError(response.Error))
{
int error = response.Error;
string message = response.Message;
(response as MessageObject)?.Dispose();
throw new RpcException(error,
$"service discovery proxy retryable service call error request: {requestName} sceneType: {sceneTypeName} error: {error} message: {message}");
}
if (throwResponseError && response.Error != ErrorCode.ERR_Success)
{
int error = response.Error;
string message = response.Message;
(response as MessageObject)?.Dispose();
throw new RpcException(error,
$"service discovery proxy service call error request: {requestName} sceneType: {sceneTypeName} error: {error} message: {message}");
}
return response;
}
catch (RpcException rpcException)
{
++retryCount;
self = selfRef;View on GitHub (pinned to 5cab01f7a8)
Solutions
- Ensure the target service for the sceneType is healthy and registered so retry attempts succeed.
- Verify the cached ActorId for the service is fresh (re-subscribe/re-resolve if stale).
- Increase ServiceResolveRetryTimes only if the failure is genuinely transient; otherwise fix the target.
- Check whether routeKey is correct and hashes to a valid instance.
Defensive patterns
Strategy: retry
Validate before calling
// Ensure the target service is registered/known before calling.
if (proxy.GetBySceneType(sceneType).Count == 0)
{
Log.Warning($"no cached service for sceneType {sceneType}; call will retry/fail");
return;
} Try / catch
catch (RpcException e) when (ServiceDiscoveryErrorHelper.ShouldTriggerFailover(e.Error))
{
// retryable; the proxy already retries up to ServiceResolveRetryTimes.
// If it propagates here, escalate or circuit-break.
} Prevention
- Keep target service instances healthy and registered.
- Refresh stale cached ActorIds via re-subscribe.
- Validate routeKey maps to a live instance.
When it happens
Trigger: CallBySceneTypeAsync calls a service whose response carries a retryable error code (ShouldRetryServiceCallError returns true — includes ShouldTriggerFailover codes like ERR_NotFoundActor, ERR_RpcFail, ERR_MessageTimeout, follower/master-unavailable). The proxy retries; if the service keeps failing, this exception surfaces.
Common situations: The target service instance is restarting (ERR_NotFoundActor); the target is overloaded (ERR_MessageTimeout); a failover-eligible error on the target that does not resolve within the retry budget; route-keyed call hitting a stale cached ActorId.
Related errors
- service discovery request retry exhausted, request: {request
- ERR_ServiceDiscoveryMasterUnavailable
- service discovery incremental register failed scene: {sceneN
- service discovery incremental unregister failed scene: {scen
- service discovery agent response error, request: {requestNam
AI-assisted analysis of egametang/ET@5cab01f7a8 (2026-08-13).
Data as JSON: /api/errors/fa1ec8c5f189c496.
Report an issue: GitHub.