2015-04-08 3 views
0

Я играю остроумие golang и orientdb, чтобы проверить их. я написал крошечное веб-приложение, в котором запрос извлекает один документ из локального экземпляра orientdb и возвращает его. когда я скамейка этого приложения с апача скамейкой, когда параллелизм выше 1 это получить следующее сообщение об ошибке:golang запрос Orientdb http interface error

2015/04/08 19:24:07 Http: паника выступающей [:: 1]: 57346: Получить http://localhost:2480/d ocument/t1/9: 1441: EOF

Когда я сам скажу Orientdb, он отлично работает с любым коэффициентом cuncurrency. также, когда я меняю URL-адрес, чтобы извлечь из этого документа что угодно (другая программа, написанная в golang, какой-то интернет-сайт и т. Д.), Приложение работает нормально. вот код:

func main() { 
    fmt.Println("starting ....") 

    var aa interface{} 
    router := gin.New() 
    router.GET("/", func(c *gin.Context) { 
     ans := getdoc("http://localhost:2480/document/t1/9:1441") 
     json.Unmarshal(ans, &aa) 
     c.JSON(http.StatusOK, aa) 
    }) 

    router.Run(":3000") 
} 
func getdoc(addr string) []byte { 
    client := new(http.Client) 
    req, err := http.NewRequest("GET", addr, nil) 
    req.SetBasicAuth("admin","admin") 
    resp, err := client.Do(req) 
    if err != nil { 
     fmt.Println("oops", resp, err) 
     panic(err) 
    } 
    defer resp.Body.Close() 
    body, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
     panic(err) 
    } 
    return body 
} 

заранее спасибо

+0

orientdb версия: 2.0.4, windows 64 bit, golang 1.4.1 – whitewitcher

ответ

0

В KEEPALIVE соединения становятся закрытыми на вас по какой-то причине. Возможно, вы подавляете сервер или преодолеваете максимальное количество подключений, к которым может обращаться база данных.

Также текущий пул соединений http.Transport не работает хорошо с синтетическими бенчмарками, которые делают соединения как можно быстрее и могут быстро исчерпать доступные дескрипторы файлов или порты (issue/6785).

Чтобы проверить это, я бы установил Request.Close = true, чтобы предотвратить использование транспорта с помощью пула keepalive. Если это работает, один из способов справиться с этим с помощью keepalive - это специально проверить на io.EOF и повторить этот запрос, возможно, с некоторой задержкой отсрочки.

+0

Большое вам спасибо, я устанавливаю req.close = true перед client.do, и все в порядке. но это будет исправлено после закрытия этой проблемы? или это хорошая практика для применения в приложении, когда у нас есть одна поездка с запросом-ответом? и это может быть основным вопросом, но почему база данных хочет сохранить связь вживую? – whitewitcher

+0

Сервер поддерживает соединение, потому что он использует http/1.1, и это самый эффективный способ использования подключений. Если это происходит только с синтетическими бенчмарками, вам, вероятно, не стоит беспокоиться об этом, но вы также можете справиться с EOF, как я уже упоминал. – JimB

Смежные вопросы