all the refactor
This commit is contained in:
+40
-39
@@ -6,6 +6,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"git.k6n.net/mats/platform/rabbit"
|
||||
amqp "github.com/rabbitmq/amqp091-go"
|
||||
)
|
||||
|
||||
@@ -25,7 +26,7 @@ func newRabbitPublisher(url string) *rabbitPublisher {
|
||||
}
|
||||
|
||||
func (p *rabbitPublisher) connect() error {
|
||||
conn, err := amqp.Dial(p.url)
|
||||
conn, err := rabbit.Connect(p.url, "cart-order-publisher")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -91,50 +92,50 @@ func ingestOrderFromQueue(ctx context.Context, s *server, body []byte) error {
|
||||
}
|
||||
|
||||
// startOrderIngest connects to AMQP and consumes "order-queue" until ctx is
|
||||
// done.
|
||||
// done. The connection is reconnecting — on broker blips the caller re-declares
|
||||
// the queue and re-consumes automatically.
|
||||
func startOrderIngest(ctx context.Context, amqpURL string, s *server) {
|
||||
conn, err := amqp.Dial(amqpURL)
|
||||
conn, err := rabbit.Dial(amqpURL, "cart-order-ingest")
|
||||
if err != nil {
|
||||
s.logger.Warn("order ingest disabled: amqp dial failed", "err", err)
|
||||
return
|
||||
}
|
||||
ch, err := conn.Channel()
|
||||
if err != nil {
|
||||
s.logger.Warn("order ingest disabled: channel failed", "err", err)
|
||||
_ = conn.Close()
|
||||
return
|
||||
}
|
||||
q, err := ch.QueueDeclare("order-queue", false, false, false, false, nil)
|
||||
if err != nil {
|
||||
s.logger.Warn("order ingest disabled: queue declare failed", "err", err)
|
||||
_ = ch.Close()
|
||||
_ = conn.Close()
|
||||
return
|
||||
}
|
||||
msgs, err := ch.Consume(q.Name, "order-service", true, false, false, false, nil)
|
||||
if err != nil {
|
||||
s.logger.Warn("order ingest disabled: consume failed", "err", err)
|
||||
_ = ch.Close()
|
||||
_ = conn.Close()
|
||||
return
|
||||
}
|
||||
s.logger.Info("ingesting orders from order-queue")
|
||||
go func() {
|
||||
defer conn.Close()
|
||||
defer ch.Close()
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case d, ok := <-msgs:
|
||||
if !ok {
|
||||
s.logger.Warn("order ingest: channel closed")
|
||||
// Reconnecting consumer: re-declare queue and re-consume on reconnect.
|
||||
conn.NotifyOnReconnect(func() {
|
||||
ch, err := conn.Channel()
|
||||
if err != nil {
|
||||
s.logger.Warn("order ingest: channel on reconnect", "err", err)
|
||||
return
|
||||
}
|
||||
q, err := ch.QueueDeclare("order-queue", false, false, false, false, nil)
|
||||
if err != nil {
|
||||
s.logger.Warn("order ingest: queue declare on reconnect", "err", err)
|
||||
_ = ch.Close()
|
||||
return
|
||||
}
|
||||
msgs, err := ch.Consume(q.Name, "order-service", true, false, false, false, nil)
|
||||
if err != nil {
|
||||
s.logger.Warn("order ingest: consume on reconnect", "err", err)
|
||||
_ = ch.Close()
|
||||
return
|
||||
}
|
||||
s.logger.Info("order ingest: consuming from order-queue (reconnect)")
|
||||
go func() {
|
||||
defer ch.Close()
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
}
|
||||
if err := ingestOrderFromQueue(ctx, s, d.Body); err != nil {
|
||||
s.logger.Error("order queue ingest failed", "err", err)
|
||||
case d, ok := <-msgs:
|
||||
if !ok {
|
||||
s.logger.Warn("order ingest: channel closed (will reconnect)")
|
||||
return
|
||||
}
|
||||
if err := ingestOrderFromQueue(ctx, s, d.Body); err != nil {
|
||||
s.logger.Error("order queue ingest failed", "err", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
}()
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user