Sobes.tech
Senior

Service voor het afhandelen van gebruikersverzoeken op Telegram De gebruiker kan een rapport sturen Beheerders kunnen rapporten verwerken De beheerder kan feedback geven aan de gebruiker DAU = 100 Beschikbaarheid = 99,95 % RPS = 100 Ticket Service POST /api/v1/tickets // aanmaken GET /api/v1/tickets/{id} PATCH tickets/{id}/status PATCH tickets/{id}/assign Diagram: Gebruiker en admin gaan naar API Gateway API Gateway gaat naar Ticket Service en Admin Service Ticket Service gaat naar PgSQL

sobes.tech AI

Antwoord van 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 })
}

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