--- description: gnet EventLoop rules for the TCP transport. globs: internal/transport/tcp/**/*.go alwaysApply: false --- # TCP / gnet EventLoop may: parse PROXY (before TLS), TLS, decode Frame, heartbeat, PUSH_ACK, rate-limit check, `TaskPool.Submit`, `AsyncWrite`. EventLoop must not: MySQL, Redis, upload, group member expand, deliver fanout. Heartbeat / PUSH_ACK stay in the loop. `AUTH` / `SEND_MESSAGE` / `SYNC_*` / `READ` / `RECALL` go to TaskPool. `TaskPool` is a bounded channel. Full → `errs.ErrBusy`, client retries with the same `client_msg_id`. Do not block `OnTraffic` on MySQL. Business modules send via `session.Manager`, never `gnet.Conn`. Same `device_id` kicks the old connection. Do not close a connection solely because PUSH_ACK timed out. gnet options: Multicore, 16MB buffers, TCPKeepAlive 30s. IdleTimeout 120s. Align with Nginx `proxy_timeout`.