Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Goのnet.TCPConnの話/shibuya.go01

 Goのnet.TCPConnの話/shibuya.go01

shunsukeaihara

February 09, 2016
Tweet

More Decks by shunsukeaihara

Other Decks in Technology

Transcript

  1. とりあえず •  @shunsukeaihara   –  フリーランス.    組み込み向け信号処理理  〜~  分散機械学習とか

      •  最近のGolang仕事   –  ウェアラブルトランシーバー向けVoIPサーバ   –  家庭⽤用ロボットの制御系・⾳音声信号処理理周り   –  アドネットワーク・メディア向け広告配信サーバ   –  ファイル転送サーバ/クライアント
  2. net.TCPConnの挙動でハマる •  制御コマンドのブロードキャ ストや死活監視はTCP   •  ⾮非同期のTCPソケットなので安 ⼼心してたらネットワーク環境 が良良い所にいるクライアント の挙動が不不安定に

      •  雪⼭山でのフィールドテスト 時、⻑⾧長期間ネットが不不安定 な場合で始めて再現 packet  lossしまくる 環境に移動 コマンド送信したクライアントのSocketか ら読みだしているgorutineが固まって⾃自前 のpingタイムアウトで追い出されたり
  3. net.TCPConnはBlockする可能性がある •  TCPConnも、Socket  Bufferが溢れている場合、errにEAGAINが返ると思っ て、プロトタイプ時はそこでsokcetをcloseすればいいと思っていた   •  hFps://golang.org/src/net/fd_unix.go#L310   • 

    BufferがあくまでWaitしている      if  err  ==  syscall.EAGAIN  {          if  err  =  fd.pd.WaitWrite();  err  ==  nil  {            con?nue          }        }
  4. (対処2)ブロックしないchannelを使う •  channelもブロックする可能性は有るけど   func  (ch  *HogeChan)    buffer(){  

    var  next  interface{}   for  {    select{    case  data  :=  <-­‐  ch.inChan:      ch.queue.Enqueue(data)    case  ch.outChan  <-­‐  next:      ch.queue.Dequeue()    }    if  ch.queue.Length()  >  0{      next  =  ch.queue.Peak()    }else{      next  =  nil    }   }   }   •  queueを持ったgorou?neを間に噛ま せばブロックしない   •  参考   –  hFps://github.com/eapache/channels 後ろが詰まっている時はこのcaseが呼ばれず常に inputの⽅方のcaseが呼ばれてselect抜けるので inChanへの書き込みがブロックしなくなる 擬似コードなのでそのまま使っちゃダメ