WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Go · Guru · question 84 of 100

How would you handle a scenario where you need to maintain long-lived connections with a large number of clients in Go?

📕 Buy this interview preparation book: 100 Go questions & answers — PDF + EPUB for $5

In a scenario where you need to maintain long-lived connections with a large number of clients in Go, you should use concurrency features, such as goroutines and channels, for efficient communication and resource management. Additionally, consider connection pooling to manage and reuse resources efficiently.

Here’s a detailed explanation:

1. Use Goroutines:

Goroutines are lightweight Go threads that are managed by the Go runtime, allowing you to perform concurrent tasks efficiently. For each incoming connection, create a separate goroutine to handle it independently, making sure that handling one connection does not block others.

Example:

package main

import (
    "fmt"
    "net"
)

func handleConnection(conn net.Conn) {
    defer conn.Close()
    
    // Process the connection here
}

func main() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error on listening:", err.Error())
        return
    }
    defer ln.Close()

    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println("Error on accepting connection:", err.Error())
            continue
        }

        go handleConnection(conn) // Create a new goroutine for each connection
    }
}

2. Use Channels: Channels are the primary mechanism for communication between goroutines in Go. They provide synchronization and data exchange between goroutines, allowing you to efficiently manage and share state between long-lived connections.

Example:

package main

import (
    "fmt"
    "net"
)

type Msg struct {
    Conn net.Conn
    Data []byte
}

func connectionHandler(connections chan net.Conn) {
    // Process connections from the channel
}

func main() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error on listening:", err.Error())
        return
    }
    defer ln.Close()

    connections := make(chan net.Conn)
    go connectionHandler(connections)

    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println("Error on accepting connection:", err.Error())
            continue
        }

        connections <- conn
    }
}

3. Use Connection Pooling: Managing a large number of connections can consume a significant amount of resources, so it’s important to use connection pooling for efficient resource management. Connection pooling helps you limit the number of open connections, reuse them, and close idle ones.

Here’s an example of implementing connection pooling using ‘sync.Pool‘ and ‘net.Conn‘:

package main

import (
    "net"
    "sync"
    "time"
)

type Pool struct {
    connectionQueue chan net.Conn
    sync.Pool
}

func NewPool(initialSize int) *Pool {
    pool := &Pool{
        connectionQueue: make(chan net.Conn, initialSize),
    }
    
    pool.New = func() interface{} {
        conn, err := net.Dial("tcp", "localhost:8080")
        if err != nil {
            panic(err)
        }
        return conn
    }
    
    for i := 0; i < initialSize; i++ {
        pool.Put(pool.New())
    }
    
    return pool
}

func (pool *Pool) GetConnection() net.Conn {
    return <-pool.connectionQueue
}

func (pool *Pool) ReleaseConnection(conn net.Conn) {
    pool.connectionQueue <- conn
}

func main() {
    pool := NewPool(10)
    
    conn := pool.GetConnection()
    defer conn.Close()
    
    // Use the connection

    // Return the connection to the pool
    pool.ReleaseConnection(conn)
}

In summary, to handle long-lived connections with a large number of clients in Go, you should use goroutines for concurrent processing, channels for communication between goroutines, and connection pooling for resource management.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Go interview — then scores it.
📞 Practice Go — free 15 min
📕 Buy this interview preparation book: 100 Go questions & answers — PDF + EPUB for $5

All 100 Go questions · All topics