fix: review findings (async SQS dispatcher, backoff, batch insert, shutdown order, pagination, HMAC) + loadtest fixes; v0.1.6
This commit is contained in:
@@ -34,16 +34,25 @@ func Run(ctx context.Context, cfg *config.Config, sqsClient *sqs.Client, log *sl
|
||||
// OnConnectHandler, т.е. повторяется при каждом (ре)подключении.
|
||||
// Иначе после потери сессии EMQX бридж оставался бы без подписки
|
||||
// (прецедент 2026-08-16: реконнект без resubscribe → телеметрия терялась).
|
||||
handler := newMessageHandler(ctx, sqsClient, queueURL, log)
|
||||
//
|
||||
// Отправка в SQS — через диспатчер (канал + worker-пул): колбэк MQTT
|
||||
// не блокируется сетью (фикс CRITICAL из ревью 2026-08-16).
|
||||
dispatcher := newSQSDispatcher(sqsClient, queueURL, log)
|
||||
dispatcher.start(ctx)
|
||||
|
||||
handler := newMessageHandler(dispatcher, log)
|
||||
|
||||
client, err := connectMQTT(ctx, cfg, log, handler)
|
||||
if err != nil {
|
||||
dispatcher.closeAndWait()
|
||||
return err
|
||||
}
|
||||
defer client.Disconnect(250)
|
||||
|
||||
<-ctx.Done()
|
||||
log.Info("bridge: shutting down")
|
||||
// Порядок: сначала отключить MQTT (источник), затем слить остаток в SQS.
|
||||
client.Disconnect(2000)
|
||||
dispatcher.closeAndWait()
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -80,10 +89,12 @@ func connectMQTT(ctx context.Context, cfg *config.Config, log *slog.Logger, hand
|
||||
token := c.Subscribe(telemetryTopicFilter, 1, handler)
|
||||
if !token.WaitTimeout(10 * time.Second) {
|
||||
log.Error("bridge: resubscribe timeout", "filter", telemetryTopicFilter)
|
||||
c.Disconnect(100) // принудительный реконнект (подписка обязательна)
|
||||
return
|
||||
}
|
||||
if token.Error() != nil {
|
||||
log.Error("bridge: resubscribe failed", "filter", telemetryTopicFilter, "err", token.Error())
|
||||
c.Disconnect(100) // принудительный реконнект (подписка обязательна)
|
||||
return
|
||||
}
|
||||
log.Info("bridge: subscribed", "filter", telemetryTopicFilter)
|
||||
|
||||
Reference in New Issue
Block a user