Design a scalable service that solves crossword-style fill-in puzzles.
A request contains a rectangular grid with blocked cells, empty cells, optional prefilled letters, and a dictionary version. The service must return one or more assignments of dictionary words to all horizontal and vertical slots such that:
-
Each non-blocked horizontal or vertical slot is filled by one dictionary word of the correct length.
-
Prefilled letters are respected.
-
Crossing words agree on the shared letter.
-
Optional rule: the same dictionary word may not be reused in a single puzzle.
A single-machine in-memory solver is acceptable for small puzzles, but the production system must handle very large dictionaries and puzzles that produce many independent search subtasks. Discuss APIs, dictionary storage and indexing, the solving algorithm, distributed execution, scalability, fault tolerance, and monitoring.