-2

アプリは数日間動作します。しかし、ある瞬間、アプリには CLOSE_WAIT 状態のソケットが多数あり、新しいクライアントを受信できません。

多分それはある種のフラッディング(例:同期フラッド)ですか?

netstat -ant | grep CLOSE_WAIT | トイレ

3258 19548 260640

3258 - CLOSE_WAIT 状態のソケット

アップデート:

いくつかのハンドラーをコーディングします。

 func GetScore(mongo *mgo.Session, redisConn redis.Conn, renderer handlers.Render) http.Handler {

         mutex := sync.Mutex{}

         return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

           id := bson.ObjectIdHex(r.FormValue("id"))
           banner := models.Banner{}
           err := mongo.DB("db").C("collection").FindId(id).One(&banner)
           if err != nil {
             log.Panicf("Banner selecting error: %s", err);
           }
           mutex.Lock();
           sports, _ := util.GetSports(redisConn)
           mutex.Unlock();
           sport, _ := sports.FindSport(banner.SportId)
           comp, err := sport.FindCompetition(banner.CompetitionId)
           if err != nil {
               comp, _ = sport.FindCompetition(0);
               log.Println("Competition not found");
           }
           game, err := comp.FindGame(banner.GameId)

           if err != nil {
           game, _ = comp.FindGame(0)
           }
           mutex.Lock();
           scores := util.GetScore(redisConn, game.ID)
           mutex.Unlock();
           game.Score1 = scores[0]
           game.Score2 = scores[1]
           w.Header().Set("Content-Type", "application/json;application/json;charset=utf-8")
           renderer.RenderJson(w, 200, &game)
       }



       func GetScore(redisConn redis.Conn, gameId int) ([]float32) {

         redisKey :=  fmt.Sprintf("game-%d", gameId);
         bBody, err := redis.Bytes(redisConn.Do("GET", redisKey))

         if err != nil || len(bBody) == 0 {
           response, err := http.DefaultClient.Get(fmt.Sprintf("%s%d", GameApi, gameId))

           if err != nil {
             log.Panicf("GetScore error: %s", err)
           }

           bBody, _ = ioutil.ReadAll(response.Body);
           redisConn.Send("SET", redisKey, bBody)
           redisConn.Send("EXPIRE", redisKey, 60 * 5)
           redisConn.Flush()
         }
         events := GameJson{};
         err = json.Unmarshal(bBody, &events)
         if err != nil {
           log.Panicf("GetScore json error: %s", err)
         }

         var event []struct {
           Name string `json:"name"`
           Price float32 `json:"price"`
}
         if len(events.AllEvents.P1XP2) != 0 {
           event = events.AllEvents.P1XP2[0].Events
         } else {
           event = events.AllEvents.Other[0].Events
         }

         return []float32{event[0].Price, event[1].Price}
       }
4

2 に答える 2

4

CLOSE-WAIT は、TCP がローカル アプリケーションがソケットを閉じるのを待っていることを意味し、ピアからのクローズを既に受信しています。

多分それはある種のフラッディング(例:同期フラッド)ですか?

いいえ、コードのバグです。どこかでソケットを閉じていません。

問題はコードにはないようです。

問題はあなたのコードにあります。

コードは数回テストされました。

ただし、この条件、またはこの問題が発生する条件ではありません。

しかし、昨日はこの問題はありませんでした。

そのため、昨日はそれらの状態は発生しませんでした。

(コードは変更されていません。)

したがって、バグは常にそこにありました。

于 2016-12-04T21:45:55.380 に答える