smallnest / rpcx

Best microservices framework in Go, like alibaba Dubbo, but with more features, Scale easily. Try it. Test it. If you feel it's better, use it! 𝐉𝐚𝐯𝐚有𝐝𝐮𝐛𝐛𝐨, 𝐆𝐨𝐥𝐚𝐧𝐠有𝐫𝐩𝐜𝐱! build for cloud!
https://rpcx.io
Other
8.11k stars 1.17k forks source link

请问如何保证数据有序性? #833

Closed blueskydata closed 10 months ago

blueskydata commented 10 months ago

在func (s *Server) serveConn(conn net.Conn) {

 获取请求
 if s.pool != nil {
        s.pool.Submit(func() {
            s.processOneRequest(ctx, req, conn)
        })
    } else {
        go s.processOneRequest(ctx, req, conn)
    }

} 而在processOneRequest中,包含了发送相应的过程,即s.sendResponse(ctx, conn, err, req, res),在多协程(可能处于不同的线程环境中)情况下,对同一个socket发送数据,如何保证数据的一致性,比如协程A发送了几个字节,协程B发送了几个字节,然后协程A再发送几个字节。

smallnest commented 10 months ago

Go的net.Conn是并发安全的,看官方文档。你保证你发送的数据一次调用发送就行。

blueskydata commented 10 months ago

非常感谢作者及时耐心解答,祝您万事顺心!

chaoedu commented 5 months ago

游戏业务中有类似请求保序的场景,需要针对请求中同一个 player_id 的数据做顺序串行处理,相当于一个玩家一个队列,对于这样的场景大佬有什么建议吗,当前框架的 WorkerPool 好像不太好做这样的扩展(没法指定 key)。 @smallnest

dickens7 commented 5 months ago

@chaoedu 我加了一个支持传递 req message 的 WorkerPool, 你可以参考一下

https://github.com/smallnest/rpcx/pull/853