Behandle die Zustellung als mindestens einmal und mach den Handler idempotent. Prüf zuerst die Signatur, speicher dann die Event-Id des Anbieters hinter einem Unique Constraint und gib sofort 200 zurück, wenn du sie schon gesehen hast. Führ die Zustandsänderung und das Einfügen der Id in einer Transaktion aus, damit ein Absturz sie nicht halb anwendet. Halt den Handler schnell, indem du langsame Arbeit in eine Queue schiebst, und lass den Anbieter erneut zustellen, wenn du wirklich scheiterst.
Warum Interviewer das fragen
Bei Zahlungen kosten Korrektheitsfehler Geld und Vertrauen, der Interviewer will also Belege dafür, dass du über verteilte Zustellgarantien nachgedacht hast. Er hört auf Idempotenz, die in der Datenbank durchgesetzt wird statt mit einem Set im Speicher, auf Signaturprüfung und darauf, was dein Handler im Fehlerfall zurückgibt. Wer das in Produktion betrieben hat, erwähnt meist Events in falscher Reihenfolge, und das ist der zweite Bug, den jeder trifft.
So baust du deine Antwort auf
- Stell fest, dass Webhook-Zustellung mindestens einmal erfolgt.
- Beschreib Idempotenz, die über einen Unique Constraint durchgesetzt wird.
- Pack die Wirkung und den Marker in eine Transaktion.
- Erklär, was du bei Erfolg und bei Fehler zurückgibst.
Beispielantwort
Meine Grundannahme ist, dass der Anbieter dasselbe Event mehr als einmal, in falscher Reihenfolge und manchmal Stunden später zustellt, weil alle drei vorkommen. Der Handler prüft also zuerst Signatur und Zeitstempel und fügt dann die Event-Id des Anbieters in eine processed_events-Tabelle mit einem Unique Index ein. Kollidiert dieses Insert, haben wir es schon behandelt, und ich gebe sofort 200 zurück, statt die Arbeit erneut zu machen. Das wichtige Detail ist, dass das Insert und die eigentliche Wirkung, das Freischalten des Abos oder das Verbuchen der Zahlung, in derselben Transaktion passieren, damit ein auf halbem Weg sterbender Prozess nicht eines ohne das andere hinterlässt. Alles Langsame, etwa eine Belegmail, geht mit eigenem Idempotenzschlüssel in eine Queue. Ich speichere außerdem den Event-Zeitstempel und ignoriere ein Event, das älter ist als der Zustand, den ich schon habe, und genau das rettet dich, wenn eine Kündigung vor dem Upgrade eintrifft, das ihr vorausging. Bei Fehlern gebe ich bewusst 500 zurück, damit der Anbieter erneut zustellt, und ich alarmiere, wenn ein Event in der Dead-Letter-Queue landet.
Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.
So funktioniert esNachfragen, mit denen du rechnen solltest
- Was machst du, wenn Events in falscher Reihenfolge ankommen?
- Wie würdest du Events erneut abspielen, nachdem du einen Bug im Handler behoben hast?
- Wie behandelst du eine Nachricht, die bei jedem Versuch scheitert?
Weitere Fragen für Full-Stack-Entwickler
Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.
Meine Fragen vorhersagen