doutai1509
doutai1509
2014-04-27 22:50

RPC是否具有超时机制?

已采纳

If RPC does not have a timeout mechanism, how do I "kill" an RPC call if it is trying to call an RPC method of a server that is closed?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • doufu1504 doufu1504 7年前

    You can use channels to implement a timeout pattern:

    import "time"
    
    c := make(chan error, 1)
    go func() { c <- client.Call("Service", args, &result) } ()
    select {
      case err := <-c:
        // use err and result
      case <-time.After(timeoutNanoseconds):
        // call timed out
    }
    

    The select will block until either client.Call returns or timeoutNanoseconds elapsed.

    点赞 评论 复制链接分享
  • doulin6448 doulin6448 6年前

    It seems the only solution for net/rpc is to close the underlying connection when you notice stuck requests. Then the client should finish pending requests with "connection broken" errors.

    An alternative way is to use https://github.com/valyala/gorpc , which supports timeout RPC calls out of the box.

    点赞 评论 复制链接分享
  • douxiong2738 douxiong2738 4年前

    if you want to implement a timeout (to prevent a call from taking too long), then you'll want to change rpc.Dial for net.DialTimeout (notice they're separate packages: rpc vs net). Also be aware that the returned type isn't a client any more (as it is in the previous example); instead it is a 'connection'.

      conn, err := net.DialTimeout("tcp", "localhost:8080", time.Minute)
      if err != nil {
        log.Fatal("dialing:", err)
      }
    
      client := rpc.NewClient(conn)
    
    点赞 评论 复制链接分享

为你推荐