# smart-akka **Repository Path**: hubert_rust/smart-akka ## Basic Information - **Project Name**: smart-akka - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-14 - **Last Updated**: 2026-04-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README wsSession是前端和服务器通道的服务器端actor(这个是和服务绑定的) userSession 关联这个wsSession和uuid(唯一标识一个用户会话,或者其他信息也可以的) --- UserSession怎么和wsSession 这个关联起来的? 关联就是:同一个 sessionEntityId + 握手成功后发一条 AttachWs,把 WsSessionActor 的引用交给分片里的 UserSession。 流程简要如下: 发 ticket 时已经定了 sessionEntityId(和 Redis / 业务一致),前端连 WebSocket 时 URL 里带上这个 id。 握手通过后,路由在本机 spawn 出这条连接对应的 WsSessionActor(ack.session)。 立刻用 Sharding 找到「这个 sessionEntityId 对应的 UserSession」,把上面的 WsSessionActor 塞进去: onSuccess(spawnFut) { ack => val sharding = ClusterSharding(typedSystem) sharding .entityRefFor(UserSession.TypeKey, validated.sessionEntityId) ! UserSession.AttachWs(ack.session) handleWebSocketMessages( UserSession 里收到 AttachWs(ref) 就 wsRef = Some(ref),以后 PushText 就 r ! PushToClient(...)。 所以:不是两台机器「自动发现」对方,而是握手成功的那一瞬间,由连 WebSocket 的那台节点主动 AttachWs,把本地 WsSessionActor 的 ActorRef 发给(可能在别台的)UserSession。sessionEntityId 就是两边对齐用的那把钥匙。 断开时,你们流结束路径里应会发 DetachWs(若已实现)——逻辑上就是解除这次关联。用户若关心可快速 grep DetachWs。 断开时在同一路由里会对同一个 sessionEntityId 发 DetachWs,清掉 UserSession 里保存的 WsSessionActor 引用(见 WsRoutes.scala 里那两处 ! UserSession.DetachWs)。 一句话:sessionEntityId 对齐身份;握手成功 → AttachWs(wsSessionActorRef) 建立关联;连接结束 → DetachWs 拆掉关联。 --- 断开的时候,还是销毁userSession,