Sobes.tech
Senior

Benutzerservice für Anfragen in Telegram Der Benutzer kann einen Bericht senden Admins können Berichte bearbeiten Der Admin kann dem Benutzer Feedback geben DAU = 100 Verfügbarkeit = 99,95 % RPS = 100 Ticket-Service POST /api/v1/tickets // erstellen GET /api/v1/tickets/{id} PATCH tickets/{id}/status PATCH tickets/{id}/assign Diagramm: Benutzer und Admin gehen zum API Gateway Das API Gateway geht zum Ticket Service und Admin Service Der Ticket Service geht zu PgSQL

sobes.tech KI

Antwort von AI

Для сервиса обработки обращений в Telegram с DAU=100, Availability=99.95% и RPS=100 архитектура должна обеспечивать надежность, масштабируемость и удобство поддержки.

Ключевые моменты:

  • API Gateway — точка входа для пользователей и админов, маршрутизирует запросы к Ticket Service и Admin Service.
  • Ticket Service — отвечает за создание, получение и обновление статусов тикетов, хранит данные в PostgreSQL.
  • Admin Service — обрабатывает действия админов, например, назначение тикетов и отправку фидбека.

Рекомендации:

  1. База данных: PostgreSQL — хорошее решение для реляционных данных тикетов. Для повышения доступности можно использовать репликацию и автоматическое переключение (failover).

  2. Обработка статусов и назначений: PATCH-запросы должны быть идемпотентными и атомарными, чтобы избежать конфликтов при параллельной обработке.

  3. Масштабируемость: при RPS=100 нагрузка невысокая, но стоит предусмотреть горизонтальное масштабирование сервисов и API Gateway.

  4. Мониторинг и логирование: для обеспечения SLA 99.95% необходимо настроить мониторинг доступности, задержек и ошибок.

  5. Безопасность: аутентификация и авторизация пользователей и админов, валидация входящих данных.

  6. Диаграмма: User и Admin идут в API Gateway, который распределяет запросы к Ticket Service и Admin Service. Ticket Service взаимодействует с PostgreSQL для хранения данных.

Пример упрощённого эндпоинта создания тикета на Go:

func CreateTicketHandler(w http.ResponseWriter, r *http.Request) {
    var ticket Ticket
    if err := json.NewDecoder(r.Body).Decode(&ticket); err != nil {
        http.Error(w, "Invalid input", http.StatusBadRequest)
        return
    }
    // Сохранение в БД
    id, err := ticketService.Create(ticket)
    if err != nil {
        http.Error(w, "Failed to create ticket", http.StatusInternalServerError)
        return
    }
    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(map[string]interface{}{ "id": id })
}

Такой подход обеспечит удобную обработку обращений и позволит поддерживать заданные метрики доступности и производительности.