go mac环境下 rpc开发遇到的坑

88 阅读1分钟

已经解决🎉:stackoverflow.com/questions/7… 这个连接的方法不行!

解决办法是问chatgpt问出来的,之前也问了好几次,都没解决问题,可能问的方式不对

解决办法如下图 image.png

项目地址:github.com/dayueba/mrp…

code

server

github.com/dayueba/mrp…

// https://github.com/dayueba/mrpc/blob/master/transport/server_transport.go
conn, err := tl.AcceptTCP()
i++
fmt.Println("conn count: ", i)

主要就是统计一下一共建立了多少条连接

client

github.com/dayueba/mrp…

var wg sync.WaitGroup
wg.Add(10000)
for i := 0; i < 10000; i++ {
   go func() {
      defer wg.Done()
      rsp := &Response{}
      err = c.Call(context.Background(), "helloworld.Greeter.Add", req, rsp, opts...)
      if err != nil {
         atomic.AddInt64(&fail, 1)
      } else {
         atomic.AddInt64(&success, 1)
      }
   }()
}
wg.Wait()

统计失败和成功次数

std_client

github.com/dayueba/mrp…

for i := 0; i < 10000; i++ {
   go func() {
      defer wg.Done()

      conn, err := net.Dial("tcp", "127.0.0.1:8000")
      if err != nil {
         fmt.Println(err)
         return
      }
      defer conn.Close()
   }()
}

直接使用std_net建立连接

server 和 client 都运行在mac环境下

直接调用std_net建立连接

image.png

我明明要建立10000条连接,实际只建立9条,虽然每次都不一样,但是不会超过20

运行client就更离谱了

image.png

基本都是失败

为什么说是坑?

  1. 同样的代码在linux环境下测试都没问题,不仅如此,只要不把server和client部署在同一台机器上就没问题
  2. linux client -> mac server;mac client -> linux server;linux client -> linux server 都没问题
  3. mac client -> mac server 就有问题
  4. 应该是代码的问题,我新写的一个框架就没这问题,这代码写的不好,我也不想改了

更新

使用tproxy监控

在mac环境下,发现并发情况下,最多建立100多条连接,如果是顺序请求,则可以建立全部连接。

在linux环境下,一切正常,所以怀疑和操作系统有关