Промты для Go и микросервисов: 11 сценариев для gRPC, Kafka и высоконагруженного бэкенда
Разработка на Go в микросервисной архитектуре — это постоянный вызов: нужно проектировать API, обеспечивать отказоустойчивость, отлаживать гонки и оптимизировать Kafka. AI-ассистенты вроде ChatGPT или Claude могут стать незаменимыми помощниками, если знать, как правильно формулировать запросы. В этой подборке — 11 проверенных промтов, которые я ежедневно использую в работе над высоконагруженными системами. Каждый промт сопровождается примером и объяснением, почему он работает.
1. Генерация gRPC-контракта с валидацией
Проблема: Нужно быстро создать proto-файл для нового сервиса с учётом best practices.
Промт:
Сгенерируй proto3 файл для сервиса управления заказами. Включи:
- CRUD-методы
- Пагинацию для списка заказов
- Валидацию полей через protoc-gen-validate
- Комментарии для каждого поля
Используй пакет order.v1.
Результат: AI выдаёт готовый .proto с аннотациями validate.rules. Пример:
message GetOrderRequest {
string order_id = 1 [(validate.rules).string = {uuid: true}];
}
Вывод: Экономит часы на рутинном описании контрактов и снижает риск ошибок.
2. Реализация gRPC-интерцепторов для логирования и метрик
Проблема: Нужно добавить сквозное логирование и сбор метрик во все gRPC-вызовы.
Промт:
Напиши gRPC-интерцептор на Go для:
- Логирования метода, длительности, статуса
- Сбора метрик Prometheus (histogram)
- Трассировки через OpenTelemetry
Покажи пример подключения к серверу.
Результат: AI генерирует код с использованием grpc.UnaryServerInterceptor, интегрированный с prometheus и otelgrpc. Пример:
func UnaryInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
start := time.Now()
resp, err := handler(ctx, req)
duration := time.Since(start)
log.Printf("method=%s duration=%s error=%v", info.FullMethod, duration, err)
return resp, err
}
Вывод: Быстрое внедрение observability без ручного написания шаблонного кода.
3. Отладка гонок данных с помощью race detector
Проблема: В высоконагруженном сервисе периодически возникают паники из-за гонок.
Промт:
Проанализируй этот код на Go и найди потенциальные гонки данных. Предложи исправления с использованием sync.Mutex или atomic. Код: [вставить фрагмент]
Результат: AI указывает на конкурентный доступ к map и предлагает обернуть в sync.RWMutex. Пример исправления:
type SafeMap struct {
mu sync.RWMutex
m map[string]int
}
func (s *SafeMap) Get(key string) int {
s.mu.RLock()
defer s.mu.RUnlock()
return s.m[key]
}
Вывод: Сокращает время отладки с часов до минут.
4. Оптимизация потребителя Kafka
Проблема: Consumer не успевает обрабатывать сообщения, лаг растёт.
Промт:
Напиши оптимальный Kafka-consumer на Go с использованием sarama. Учти:
- Ручной коммит оффсетов
- Пакетную обработку
- Graceful shutdown
- Обработку ошибок с ретраями
Результат: AI предлагает конфигурацию с sarama.NewConfig(), настройкой Consumer.Group.Rebalance.Strategy и буферизацией. Пример:
config.Consumer.Offsets.AutoCommit.Enable = false
config.Consumer.Fetch.Default = 1024 * 1024
Вывод: Позволяет увеличить пропускную способность без изменения архитектуры.
5. Проектирование идемпотентных обработчиков
Проблема: Повторная доставка сообщений из Kafka приводит к дублированию операций.
Промт:
Предложи способ сделать обработчик идемпотентным. Используй Redis для хранения ключей идемпотентности. Напиши пример на Go.
Результат: AI генерирует middleware, который проверяет idempotency_key в Redis перед выполнением бизнес-логики. Пример:
func IdempotentMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
key := r.Header.Get("Idempotency-Key")
if key == "" { next.ServeHTTP(w, r); return }
exists, _ := redisClient.SetNX(ctx, key, 1, 24*time.Hour).Result()
if !exists { http.Error(w, "Duplicate request", http.StatusConflict); return }
next.ServeHTTP(w, r)
})
}
Вывод: Предотвращает двойные списания и другие критичные ошибки.
6. Настройка graceful shutdown для HTTP и gRPC серверов
Проблема: При деплое обрываются активные соединения.
Промт:
Покажи пример graceful shutdown для Go-сервиса, который одновременно слушает HTTP и gRPC. Учти сигналы SIGTERM, SIGINT и таймаут.
Результат: AI предлагает использовать context.WithTimeout и server.Shutdown(). Пример:
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := httpServer.Shutdown(ctx); err != nil { log.Fatal(err) }
grpcServer.GracefulStop()
Вывод: Обеспечивает плавное завершение без потери запросов.
7. Генерация моков для тестирования gRPC
Проблема: Нужно быстро создать моки для unit-тестов.
Промт:
Сгенерируй mock для gRPC-клиента OrderService на Go с использованием gomock. Включи методы CreateOrder, GetOrder.
Результат: AI выдаёт интерфейс и код мока. Пример:
type MockOrderServiceClient struct {
mock.Mock
}
func (m *MockOrderServiceClient) CreateOrder(ctx context.Context, req *CreateOrderRequest, opts ...grpc.CallOption) (*CreateOrderResponse, error) {
args := m.Called(ctx, req)
return args.Get(0).(*CreateOrderResponse), args.Error(1)
}
Вывод: Ускоряет написание тестов и повышает покрытие.
8. Анализ и оптимизация SQL-запросов в Go
Проблема: Медленные запросы к PostgreSQL тормозят сервис.
Промт:
Проанализируй этот SQL-запрос и предложи оптимизацию с помощью индексов. Покажи, как использовать EXPLAIN ANALYZE. Запрос: [вставить SQL]
Результат: AI рекомендует добавить составной индекс и переписать запрос с JOIN LATERAL. Пример:
CREATE INDEX idx_orders_user_status ON orders (user_id, status) WHERE status = 'active';
Вывод: Снижает время выполнения запроса в разы.
9. Реализация circuit breaker для внешних вызовов
Проблема: Падение внешнего сервиса вызывает каскадные отказы.
Промт:
Напиши пример использования circuit breaker (sony/gobreaker) в Go для HTTP-клиента. Добавь fallback и логирование.
Результат: AI генерирует обёртку с настройкой gobreaker.Settings. Пример:
var cb *gobreaker.CircuitBreaker
func init() {
cb = gobreaker.NewCircuitBreaker(gobreaker.Settings{Name: "http-client", Timeout: 5 * time.Second})
}
func DoRequest() ([]byte, error) {
body, err := cb.Execute(func() (interface{}, error) {
resp, err := http.Get("http://service")
if err != nil { return nil, err }
defer resp.Body.Close()
return io.ReadAll(resp.Body)
})
if err != nil { return nil, err }
return body.([]byte), nil
}
Вывод: Повышает устойчивость системы к сбоям.
10. Настройка трейсинга с OpenTelemetry
Проблема: Сложно отследить путь запроса через микросервисы.
Промт:
Покажи, как добавить OpenTelemetry трейсинг в Go-сервис с gRPC и Kafka. Включи экспорт в Jaeger.
Результат: AI предлагает код инициализации трейсера и примеры инструментирования. Пример:
tp := trace.NewTracerProvider(trace.WithBatcher(exporter))
otel.SetTracerProvider(tp)
Вывод: Упрощает диагностику распределённых систем.
11. Генерация Dockerfile и docker-compose для микросервиса
Проблема: Нужно быстро упаковать сервис и зависимости.
Промт:
Создай оптимальный Dockerfile для Go-сервиса (multi-stage) и docker-compose с PostgreSQL, Redis, Kafka. Учти кеширование слоёв.
Результат: AI выдаёт готовые файлы с FROM golang:1.21 AS builder и FROM alpine:latest. Пример:
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /bin/service ./cmd/service
FROM alpine:latest
COPY --from=builder /bin/service /bin/service
CMD ["/bin/service"]
Вывод: Ускоряет деплой и снижает размер образа.
Заключение
Эти 11 промтов покрывают ключевые задачи бэкенд-разработчика на Go: от проектирования API до отладки и оптимизации. Главное — давать AI конкретные требования и контекст. Экспериментируйте, адаптируйте под свой стек и делитесь своими находками. Помните: AI — это инструмент, который усиливает вашу экспертизу, а не заменяет её. Начните с одного промта сегодня и почувствуйте разницу в скорости разработки.
Источники:
- Официальная документация gRPC: https://grpc.io/docs/
- Apache Kafka Documentation: https://kafka.apache.org/documentation/
- Go Race Detector: https://go.dev/doc/articles/race_detector
- OpenTelemetry Go: https://opentelemetry.io/docs/languages/go/
Комментарии