Senior
Otázka o pomalej službe Na príklade vytvárania objednávky. Existuje požiadavka na službu a odpoveď, medzi týmito dvoma krokmi ukládame do analýzy objednané produkty (napríklad na sledovanie popularity produktov). Analytická služba občas pracuje pomaly alebo timeoutuje, a my nestíhame odpovedať, strácame objednávky. Čo robiť, aby sme prestali strácať objednávky a peniaze? Vymyslite, ako paralelizovať objednávku a analýzu.
sobes.tech AI
Odpoveď od AI
Чтобы не терять заказы из-за медленной аналитики, нужно отделить обработку заказа от аналитики и сделать их асинхронными.
Пример решения:
- При создании заказа сервис сразу отвечает клиенту, подтверждая заказ.
- Информация о заказе отправляется в очередь сообщений (например, Kafka, RabbitMQ).
- Отдельный сервис или воркер читает сообщения из очереди и обновляет аналитику.
Такой подход позволяет распараллелить обработку и не блокировать основной поток заказа из-за медленной аналитики.
Пример на Go с использованием канала для имитации очереди:
type Order struct {
ID string
Items []string
}
var analyticsChan = make(chan Order, 100)
func createOrder(order Order) {
// Сразу подтверждаем заказ
fmt.Println("Order created:", order.ID)
// Отправляем в аналитику асинхронно
go func() { analyticsChan <- order }()
}
func analyticsWorker() {
for order := range analyticsChan {
// Обработка аналитики
fmt.Println("Processing analytics for order:", order.ID)
time.Sleep(time.Second * 2) // имитация медленной работы
}
}
func main() {
go analyticsWorker()
createOrder(Order{ID: "123", Items: []string{"item1", "item2"}})
time.Sleep(time.Second * 5)
}
Такой подход повышает отказоустойчивость и производительность.