Lesson 19 · Senior NATS practice

Mock senior NATS interview pack

A retrieval-first mock pack for turning the whole NATS JetStream course into clear, interview-grade answers you can say under pressure.

Your win: run a realistic senior NATS mock interview on yourself, score your answers honestly, and turn weak spots into a focused review plan.

How to get the most out of this page

This page works best if you treat it like a real interview. Answer first. Then check the answer points. Then answer again more cleanly. That rhythm matters because recognition is not the same as recall.

The goal is not to “cover the page.” The goal is to train yourself to say clear, structured answers under time pressure.

In plain English Plain English: answer out loud before checking the answer points. Recognition is not recall.
The answer checklist A strong answer should usually include: (1) the model, (2) the main trade-off or risk, and (3) a repo-grounded consequence or example.

The format

Round 1 · Core model and routing

  1. What is the most important difference between core NATS and JetStream?
  2. Why is subject taxonomy more than naming style?
  3. What do wildcard boundaries decide besides matching?
  4. Why does a stream use InterestPolicy here?
  5. Why is a consumer not the same thing as a subscriber callback?
  6. Why are most learner-owned consumers push queue groups?
Round 1 · Strong answer points
  1. Core vs JetStream. Core NATS is at-most-once live pub/sub; JetStream adds persistence, consumers, replay, and at-least-once delivery.
  2. Subject taxonomy. It shapes wildcard capture, stream boundaries, ACLs, and future fan-out semantics.
  3. Wildcard boundaries. They define what events get captured and reasoned about together, not just what names match.
  4. InterestPolicy. The repo wants internal events kept only while interested consumers still need them, not retained as a long replay log.
  5. Consumer. It is the stateful read cursor with delivery settings, not just the handler function.
  6. Push queue groups. They fit the repo’s common event-fanout workload with straightforward horizontal sharing.

Round 2 · Delivery, replay, and safety

  1. How does JetStream become at-least-once here?
  2. Why is Ack-only handling both simple and limiting?
  3. Why isn’t Nats-Msg-Id dedup enough by itself?
  4. What problem does SkipMsgOlderThan solve?
  5. How does tenant isolation survive the async hop?
  6. Why is the activity-log path the best contrast example in the repo?
Round 2 · Strong answer points
  1. At-least-once. AckExplicit means unacked work redelivers after AckWait until the cap.
  2. Ack-only limits. It is simpler, but it gives up richer failure intent like explicit Nak/Term behavior and a cleaner poison-message path.
  3. Dedup boundary. Publish dedup does not replace application idempotency or stale-event reasoning.
  4. SkipMsgOlderThan. It prevents replay storms from reprocessing ancient events that are no longer meaningful.
  5. Tenancy hop. DataInMessage carries resource_path and user context, and handleMsg re-injects claims before the handler runs.
  6. Activity-log contrast. It is the one pull consumer, showing batch-oriented flow control rather than the repo’s normal push queue-group shape.

Round 3 · Senior design judgment

  1. What is the real gap in the repo’s poison-message story?
  2. What is the real job of a DLQ in this context?
  3. How would you review whether a subject family is too broad?
  4. When would you choose pull instead of push for a new JetStream path?
  5. When should a flow move from NATS to Kafka?
  6. How would you summarize this repo’s NATS philosophy honestly?
Round 3 · Strong answer points
  1. Poison gap. Ack-only handling plus no DLQ means poison messages are either retried by timeout or acknowledged away with limited recovery visibility.
  2. DLQ. Preserve failed-message evidence while letting the main flow continue safely.
  3. Broad subject family. Ask whether unrelated events now share wildcard, retention, and ownership assumptions they should not share.
  4. Pull choice. Choose it when the client needs controlled fetch size, batching, and pacing rather than server-driven push.
  5. NATS to Kafka move. Move when the workload wants a more replayable durable pipeline shape or aligns better with the Kafka data-flow ecosystem.
  6. Repo philosophy. Fast internal durable eventing with JetStream, envelope-based tenancy and tracing restoration, push queue-group defaults, explicit trade-offs around Ack-only failure handling, and selective Kafka migration where the pipeline shape fits better.

Self-scoring rubric

ScoreMeaning
0I could not explain it without notes.
1I gave fragments, but the answer was incomplete or fuzzy.
2I explained the main idea, but missed the trade-off, risk, or repo consequence.
3I gave a strong, clear answer with model + trade-off/risk + repo consequence.
Recovery map — where to go next Missed core NATS and JetStream? Revisit Lessons 1–4. Missed the golib and delivery model? Revisit Lessons 5–8. Missed repo application and bus choice? Revisit Lessons 9–12. Missed senior judgment? Revisit Lessons 13–18.

Q1. The main rule of this mock pack is…

Retrieval first is what turns recognition into interview recall.
What are the three ingredients of a strong senior NATS answer?
recall, then click to reveal
A clear NATS or JetStream model, the important trade-off or failure risk, and a repo-grounded consequence or example.
If you want, I can now run this as a live mock senior NATS interview and grade you answer by answer. Ask me.

Sources. This pack synthesizes the whole course into retrieval practice.