Amalgamation constructions build common extensions of two structures that have a common substructure, preserving specified embeddings. Using the extension lemma repeatedly, we can amalgamate any family of structures with the amalgamation property to build universal models. This is the central technique for constructing saturated and homogeneous models.
Perform an explicit amalgamation of two graph structures over a common subgraph, then generalize using the extension lemma and compactness.
From your work on the amalgamation property and the extension lemma, you know the two key ingredients: the amalgamation property says that whenever two structures B and C both extend a common substructure A, there exists a further structure D into which both B and C embed in a compatible way; the extension lemma says that a single elementary embedding can be extended one step at a time. The amalgamation construction takes these two tools and builds something much larger — a model that has absorbed every possible extension in a controlled, coherent way.
The basic construction is easiest to see with graphs. Suppose you have a graph A shared between two larger graphs B and C. Amalgamating B and C over A means building a new graph D that contains both, identified along A. Concretely: start with the vertex sets of B and C, declare that any vertex in B ∩ A is the same as the corresponding vertex in C ∩ A, and include all edges from both. The resulting graph D contains B and C as subgraphs, and they agree wherever they overlap. This single step is what the amalgamation property guarantees is always possible (for theories with that property). The extension lemma tells you the new inclusions A → B → D and A → C → D are genuine embeddings, preserving all the structural properties you care about.
The power comes from iterating. Begin with a countable collection of structures M₀, M₁, M₂, ... where each Mₙ₊₁ extends Mₙ by one more element or one more type. Apply the amalgamation construction at each stage to build a chain M₀ ⊆ M₁ ⊆ M₂ ⊆ .... Take the directed union (or colimit) of this chain: the elements of the limit are equivalence classes of elements that eventually stabilize, and the structure on the limit is inherited from the chain. By the extension lemma, each Mₙ embeds elementarily into the limit, so the limit satisfies any first-order sentence that any stage satisfies. This is how saturated and homogeneous models are built: you arrange the chain so that every type over every finite parameter set is realized at some stage, then the limit realizes them all.
The role of compactness is to guarantee that the chain can be set up in the first place. To extend Mₙ so that it realizes a given type p, you need to know that p is consistent with the theory of Mₙ. Compactness says that if every finite subset of p ∪ Th(Mₙ) has a model, then the whole thing has a model — so you can realize p by finding a model of the extended theory and taking the image. This converts the problem of realizing infinitely many conditions simultaneously into a series of finite consistency checks, each manageable by the extension lemma.
The amalgamation construction is thus a template for model construction: identify what properties you want the limit to have, express each property as a type to be realized, arrange the extension chain to realize each type in turn, and take the union. The result is a model with prescribed properties that no single finitely-axiomatized extension could guarantee. This template underlies the existence proofs for universal homogeneous models, monster models, and saturated models — all of which are built by variants of the same amalgamation-and-limit argument you are studying here.