Interviewfrage für Full-Stack-Entwickler

Wie würdest du sicherstellen, dass ein Payment-Webhook einen Kunden nie doppelt belastet oder doppelt freischaltet?

Worauf der Interviewer abzielt, wie du deine Antwort aufbaust und ein gesprochenes Beispiel zum Anpassen.

Kurzantwort

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

Gesprochenes Beispiel, erste Person

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 es

Nachfragen, 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

Üb die harten Fragen, bevor sie gestellt werden

Trainier mit einem Live-Copiloten und geh dann vorbereitet rein. Ein $29 Session Pass bringt dich durch das Vorstellungsgespräch, ohne Abo und ohne Bindung.

GhostPilot holen