Dies ist unser Setup, wir haben ein Thema und dieses Thema hat zwei Abonnements v1 und v2 mit exakt identischen Einstellungen, beide sind Pull-Abonnement mit 10 sek ack Frist.
Beide Subskriptionen v1 und v2 trennen dedizierte Datenflüsse, wobei der Datenfluss von v2 optimiert ist, aber ziemlich genau dasselbe tut.gcp PubSub bekommen "Verarbeitungsverzögerung war hoch"
Problem ist, dass wir hin und wieder sehen wir unten Warnmeldungen und Backlog beginnt nur in v2 Abonnement aufzubauen und v1 zeigt wenig bis keinen Rückstand.
08:53:56.000 ${MESSAGE_ID} Pubsub processing delay was high at 72 sec.
Dataflow-Protokoll in v2 zeigt nichts offensichtliches außer den obigen Nachrichten. In der Tat ist v2 Datenfluss CPU-Nutzung niedriger als v1, so kann ich keinen Sinn daraus machen.
Fragen:
- Was Verzögerungsverarbeitung verursacht, und wie kann ich es beheben?
- Warum erhält das Abonnement der Version 1 nicht dieselben Warnungen?
bei 2017/01/17
via @ Ben es scheint, dass wir Wie vorgeschlagen aktualisiert, dass Pardo Filteroperation direkt nach PubSub Lese tun unerwartet hohe Latenz zu treffen. Aber unter Berücksichtigung getClassroomIds
ist eine einfache Java-Liste Ich bin mir nicht sicher, wie ich dieses Problem angehen kann. Eine Frage ist, dass wir Coder auf Pubsub faul angewendet haben? Entpacken und Deserialisieren haben wir im Coder definiert, wenn ProcessContext#element()
aufgerufen wird?
def processElement(c: DoFn[Entity, Entity]#ProcessContext) = {
val startTime = System.currentTimeMillis()
val entity = c.element()
if (!entity.getClassroomIds.isEmpty) {
c.output(entity)
}
val latencyMs = System.currentTimeMillis() - startTime
if (latencyMs > 1000) {
// We see this warning messages during the load spike
log.warn(s"latency breached 1 second threshold: $latencyMs ms")
}
}
Job-IDs sind nützlich, um zu sehen, was mit diesen Läufen passiert ist. In der Regel bedeutet diese Meldung, dass die ParDo-Schritte, die unmittelbar auf die PubSub-Quelle folgen, langsam sind. Das Betrachten der "Shuffler" -Protokolle kann auch anzeigen, ob die Flusssteuerung Warteschlangenverzögerungen einführt. –
@BenChambers ParDo direkt nach sollte sehr einfache Filterlogik, so dass ich weiß nicht, ob das der Fall ist. Allerdings ist stream eine verschlüsselte zip, die deserialisiert werden muss, damit sie dort langsamer wird. Aber dieser Teil sollte zwischen v1 und v2 gleich sein.Und wenn Sie meinen, dass Datenfluss-Protokolle durch das "Shuffler" -Protokoll funktionieren, dann habe ich sie und andere als gelegentliche GC-Protokolle und das Protokoll "Prozessverzögerung" oben betrachtet. Ich sehe nichts um die Ereigniszeitlinie herum. – codingtwinky
v1 stream ist dataflow v1.6.1 und v2 ist dataflow v1.9.0, aber ich sehe keine offensichtliche Sache, die dazu führen könnte, dass v1.6.1 besser funktioniert – codingtwinky