Как кешировать / повторно использовать TLS-соединения в Go - PullRequest
0 голосов
/ 30 марта 2019

Я столкнулся с проблемой, когда я создаю новое соединение каждый запрос, и это ужасно неэффективно.

Я бы хотел, чтобы установленное максимальное количество соединений TLS оставалось открытым / кэшированным на моем клиенте одновременно. Когда данные готовы к передаче, они сначала проверяют, существует ли незанятое соединение, затем проверяют, может ли оно создать новое соединение (то есть число открытых соединений <максимально допустимое). Если оба значения имеют значение false, необходимо подождать, пока соединение не станет свободным или число открытых соединений уменьшится. Соединения также должны быть разорваны после того, как они простаивают в течение определенного периода времени. </p>

Вот некоторый (плохой) псевдокод того, что я имею в виду. Могу ли я получить некоторые предложения?

func newTLSConnection(netDialer, host, tlsConfig) (tls.Con) {

    // Set up the certs
    // ...

    // Make A TLS Connection
    con, _ := tls.DialWithDialer(netDialer, "tcp", host, tlsConfig)

    return con
}

func (con tls.Con) Do (someData []byte) {

    // If con 
    // Send some date to the server
    _, _ := con.Write(someData)

    // Get response from server
    response := make([]byte, 100)
    _, _ := io.ReadFull(con, response)

    return
}


main(){
    var cons []tls.Con
    maxConSize := 3

    while {

        if allConsInSliceAreBusy() && len(cons) < maxConSize{
            newCon = NewTLSConnection(...)
            cons = append(cons, newCon)
            conToUse := newCon

            conToUse.Do([]byte("stuff"))

        } else if !allConsInSliceAreBusy() {

            conToUse := firstOpenConInCons()

            conToUse.Do([]byte("stuff"))

        } else{
             // NOP. Max cons created and they are all busy.
             // Wait for one to become idle or close.
        }
    }
}

Спасибо!

1 Ответ

0 голосов
/ 30 марта 2019

То, о чем вы спрашиваете, называется пул соединений.Посмотрите исходный код пакета Fasthttp: https://github.com/valyala/fasthttp/blob/master/client.go Вы даже можете использовать эту библиотеку или другую для своих целей.

В строке 1252 вы можете найти acquireConnfunc, который делает именно то, что вам нужно:

  • Блокирует пул соединений, чтобы разрешить одновременное исключение.
  • Создает новые соединения, если пул пуст (новые соединения извлекаются из пула).
  • Производит очистку соединений в случае тайм-аута TTL.
...