{"record":{"id":"ba6f910ef929b0f5","repo":"apache/incubator-seata","slug":"0110","errorCode":"0110","errorMessage":"No available service","messagePattern":"No available service","errorType":"exception","errorClass":"FrameworkException","httpStatus":null,"severity":"critical","filePath":"core/src/main/java/org/apache/seata/core/rpc/netty/AbstractNettyRemotingClient.java","lineNumber":304,"sourceCode":"        return transactionMessageHandler;\n    }\n\n    public NettyClientChannelManager getClientChannelManager() {\n        return clientChannelManager;\n    }\n\n    protected String loadBalance(String transactionServiceGroup, Object msg) {\n        InetSocketAddress address = null;\n        try {\n            @SuppressWarnings(\"unchecked\")\n            List<InetSocketAddress> inetSocketAddressList =\n                    RegistryFactory.getInstance().aliveLookup(transactionServiceGroup);\n            address = this.doSelect(inetSocketAddressList, msg);\n        } catch (Exception ex) {\n            LOGGER.error(\"Select the address failed: {}\", ex.getMessage());\n        }\n        if (address == null) {\n            throw new FrameworkException(NoAvailableService);\n        }\n        return NetUtil.toStringAddress(address);\n    }\n\n    protected InetSocketAddress doSelect(List<InetSocketAddress> list, Object msg) throws Exception {\n        if (CollectionUtils.isNotEmpty(list)) {\n            if (list.size() > 1) {\n                return LoadBalanceFactory.getInstance().select(list, getXid(msg));\n            } else {\n                return list.get(0);\n            }\n        }\n        return null;\n    }\n\n    protected String getXid(Object msg) {\n        String xid = \"\";\n        if (msg instanceof AbstractGlobalEndRequest) {","sourceCodeStart":286,"sourceCodeEnd":322,"githubUrl":"https://github.com/apache/incubator-seata/blob/e01f97c6db397165050caa6764020410c2c8199a/core/src/main/java/org/apache/seata/core/rpc/netty/AbstractNettyRemotingClient.java#L286-L322","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Confirm the seata-server is running and registered under the cluster your service group maps to","Check service.vgroupMapping.<your-tx-service-group>=<cluster-name> and the matching cluster name in the registry","Verify registry client config (address, namespace/group for Nacos) matches the server's registry","Watch the alive instances in the registry console; if instances exist but are pruned, check health-check failures"],"exampleFix":"# registry.conf / application.yml\n# before (wrong cluster mapping)\nservice:\n  vgroupMapping:\n    my_tx_group: default_cluster   # cluster that does not exist\n\n# after\nservice:\n  vgroupMapping:\n    my_tx_group: default           # cluster the seata-server actually registers to","handlingStrategy":"retry","validationCode":"List<InetSocketAddress> alive = RegistryFactory.getInstance().aliveLookup(txServiceGroup);\nif (CollectionUtils.isEmpty(alive)) {\n    // do not attempt the send; wait for registry refresh\n    return;\n}","typeGuard":null,"tryCatchPattern":"catch (FrameworkException e) {\n    if (FrameworkErrorCode.NoAvailableService == e.getErrCode()) {\n        // back off and retry after registry refresh; alert if persistent\n    }\n}","preventionTips":["Monitor instance count for the seata cluster in the registry","Add registry health checks to the client app's readiness probe","Keep vgroupMapping->cluster mapping under test/config review"],"tags":["registry","load-balance","connection","client"],"backgroundTag":null,"analyzedSha":"e01f97c6db397165050caa6764020410c2c8199a","analyzedAt":"2026-08-14T10:23:53.097Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}