apache/incubator-seata · critical · FrameworkException

0110

0110

Error message

No available service

What it means

Thrown by AbstractNettyRemotingClient.loadBalance when it cannot pick a server address for the given transaction service group: the registry's alive lookup returned an empty list, or the load-balance selection threw (e.g. no XID for transaction-aware balancing). It is the client-side 'no TC reachable' signal before any connection attempt is made.

Source

Thrown at core/src/main/java/org/apache/seata/core/rpc/netty/AbstractNettyRemotingClient.java:304

        return transactionMessageHandler;
    }

    public NettyClientChannelManager getClientChannelManager() {
        return clientChannelManager;
    }

    protected String loadBalance(String transactionServiceGroup, Object msg) {
        InetSocketAddress address = null;
        try {
            @SuppressWarnings("unchecked")
            List<InetSocketAddress> inetSocketAddressList =
                    RegistryFactory.getInstance().aliveLookup(transactionServiceGroup);
            address = this.doSelect(inetSocketAddressList, msg);
        } catch (Exception ex) {
            LOGGER.error("Select the address failed: {}", ex.getMessage());
        }
        if (address == null) {
            throw new FrameworkException(NoAvailableService);
        }
        return NetUtil.toStringAddress(address);
    }

    protected InetSocketAddress doSelect(List<InetSocketAddress> list, Object msg) throws Exception {
        if (CollectionUtils.isNotEmpty(list)) {
            if (list.size() > 1) {
                return LoadBalanceFactory.getInstance().select(list, getXid(msg));
            } else {
                return list.get(0);
            }
        }
        return null;
    }

    protected String getXid(Object msg) {
        String xid = "";
        if (msg instanceof AbstractGlobalEndRequest) {

View on GitHub (pinned to e01f97c6db)

Solutions

  1. Confirm the seata-server is running and registered under the cluster your service group maps to
  2. Check service.vgroupMapping.<your-tx-service-group>=<cluster-name> and the matching cluster name in the registry
  3. Verify registry client config (address, namespace/group for Nacos) matches the server's registry
  4. Watch the alive instances in the registry console; if instances exist but are pruned, check health-check failures

Example fix

# registry.conf / application.yml
# before (wrong cluster mapping)
service:
  vgroupMapping:
    my_tx_group: default_cluster   # cluster that does not exist

# after
service:
  vgroupMapping:
    my_tx_group: default           # cluster the seata-server actually registers to
Defensive patterns

Strategy: retry

Validate before calling

List<InetSocketAddress> alive = RegistryFactory.getInstance().aliveLookup(txServiceGroup);
if (CollectionUtils.isEmpty(alive)) {
    // do not attempt the send; wait for registry refresh
    return;
}

Try / catch

catch (FrameworkException e) {
    if (FrameworkErrorCode.NoAvailableService == e.getErrCode()) {
        // back off and retry after registry refresh; alert if persistent
    }
}

Prevention

When it happens

Trigger: Calling an API that internally resolves a server address (e.g. client send paths that call loadBalance) when RegistryFactory.getInstance().aliveLookup(transactionServiceGroup) returns an empty list, or doSelect throws because list is empty or LoadBalanceFactory.select fails.

Common situations: Seata server down or not registered in the registry (Nacos/Eureka/Redis/etcd/ZooKeeper/File); wrong service.vgroupMapping.<group>=<cluster> config so the group maps to a cluster with no instances; registry connectivity issues from the client; all instances temporarily unhealthy.

Related errors


AI-assisted analysis of apache/incubator-seata@e01f97c6db (2026-08-14). Data as JSON: /api/errors/ba6f910ef929b0f5. Report an issue: GitHub.