Расскажите о самом интересном или сложном проекте, над которым вы работали. Чем вы в нем гордитесь?

Ответ

Я бы выделил разработку высоконагруженного микросервиса для процессинга платежей на Go. Это был интересный вызов с точки зрения производительности и надежности.

Ключевые достижения и особенности:

  • Производительность: Достигли стабильной обработки более 10 000 транзакций в секунду с p99 latency менее 50 мс.
  • Надежность: Применили паттерны отказоустойчивости, такие как Circuit Breaker, Bulkhead и Backpressure, для защиты от каскадных сбоев и перегрузок.
  • Консистентность данных: Реализовали протокол двухфазных коммитов (2PC) для атомарного обновления данных в нескольких распределенных системах (например, в основной базе и системе аналитики).
  • Оптимизация работы с БД: Написали кастомный пул соединений для PostgreSQL. Это позволило нам добавить специфичную логику (например, pre-ping перед использованием соединения) и собрать детальные метрики по использованию пула, которые были недоступны в стандартных драйверах.

Пример упрощенного кастомного пула соединений:

// Custom connection pool
type ConnPool struct {
    conns   chan *pgx.Conn
    maxOpen int
    connStr string
}

// NewConnPool creates a new connection pool.
func NewConnPool(connStr string, maxOpen int) (*ConnPool, error) {
    pool := &ConnPool{
        conns:   make(chan *pgx.Conn, maxOpen),
        maxOpen: maxOpen,
        connStr: connStr,
    }
    // Pre-populate the pool
    for i := 0; i < maxOpen; i++ {
        conn, err := pgx.Connect(context.Background(), connStr)
        if err != nil {
            return nil, err
        }
        pool.conns <- conn
    }
    return pool, nil
}

// Get retrieves a connection from the pool.
func (p *ConnPool) Get(ctx context.Context) (*pgx.Conn, error) {
    select {
    case conn := <-p.conns:
        return conn, nil
    case <-ctx.Done():
        return nil, ctx.Err()
    }
}

// Put returns a connection to the pool.
func (p *ConnPool) Put(conn *pgx.Conn) {
    select {
    case p.conns <- conn:
        // Connection returned successfully
    default:
        // Pool is full, close the connection
        conn.Close(context.Background())
    }
}

Этот сервис успешно работает в продакшене более двух лет без критических инцидентов, что подтверждает правильность выбранных архитектурных решений.

Ответ 18+ 🔞

Да ты послушай, на что меня, блядь, подрядили! Делали мы тут одну хитровыебанную систему — микросервис на Go для платежей, чтобы всё летало, как угорелое.

Что за дичь мы там понаворотили:

  • Скорость: Выжали из этой штуки стабильные 10 000 транзакций в секунду, и чтобы 99% из них укладывались в 50 миллисекунд, а не в пизду, как обычно.
  • Живучесть: Натыкали туда всяких умных штук, типа Circuit Breaker и Backpressure, чтобы если одна часть системы накрылась, остальные не пошли ко дну, как мудаки. Чистая паранойя, но она работает.
  • Целостность данных: Впилили протокол двухфазных коммитов (2PC), чтобы данные везде обновлялись атомарно. Иначе получается — деньги списались, а в аналитике хуй с горы, и потом ищи-свищи.
  • База данных: А вот тут, ёпта, пришлось попотеть. Стандартный пул соединений к PostgreSQL был как мартышлюшка — вроде работает, но метрик нет, а логику свою не воткнёшь. Пришлось городить свой, блядь, велосипед.

Смотри, какую простыню накодили для пула:

// Кастомный пул соединений, потому что штатный — сосалка
type ConnPool struct {
    conns   chan *pgx.Conn
    maxOpen int
    connStr string
}

// NewConnPool создаёт новый пул.
func NewConnPool(connStr string, maxOpen int) (*ConnPool, error) {
    pool := &ConnPool{
        conns:   make(chan *pgx.Conn, maxOpen),
        maxOpen: maxOpen,
        connStr: connStr,
    }
    // Заранее натыкаем соединений в канал
    for i := 0; i < maxOpen; i++ {
        conn, err := pgx.Connect(context.Background(), connStr)
        if err != nil {
            return nil, err
        }
        pool.conns <- conn
    }
    return pool, nil
}

// Get вытаскивает соединение из пула.
func (p *ConnPool) Get(ctx context.Context) (*pgx.Conn, error) {
    select {
    case conn := <-p.conns:
        return conn, nil
    case <-ctx.Done():
        return nil, ctx.Err()
    }
}

// Put суёт соединение обратно в пул.
func (p *ConnPool) Put(conn *pgx.Conn) {
    select {
    case p.conns <- conn:
        // Всё ок, вернули
    default:
        // А, бля, пул переполнен — прикрываем лавочку
        conn.Close(context.Background())
    }
}

И знаешь что? Эта бандура уже больше двух лет в проде пашет, и ни одного, сука, пиздеца! Так что наши архитектурные извращения оказались не такими уж и бредовыми.