|
| 1 | +digraph Architecture { |
| 2 | + node [shape=box, fontname="Helvetica", style=filled, fillcolor=lightblue]; |
| 3 | + |
| 4 | + Datastream [label="Source DB\n(via Datastream)", shape=cylinder]; |
| 5 | + GCS [label="Google Cloud Storage\n(AVRO/JSON)", shape=folder]; |
| 6 | + Spanner [label="Cloud Spanner\n(Destination & Shadow Tables)", shape=cylinder]; |
| 7 | + DLQ [label="Dead Letter Queue\n(GCS)", shape=folder]; |
| 8 | + FilteredEventsGCS [label="Filtered Events\n(GCS)", shape=folder]; |
| 9 | + |
| 10 | + subgraph cluster_dataflow { |
| 11 | + label="Cloud Dataflow (DataStreamToSpanner)"; |
| 12 | + fontname="Helvetica-Bold"; |
| 13 | + style=dashed; |
| 14 | + color=gray; |
| 15 | + |
| 16 | + ReadDataStream [label="DataStreamIO\n(Read Events)"]; |
| 17 | + ProcessSchema [label="Process Information Schema\n(Read DDL)"]; |
| 18 | + ReadDLQ [label="FileBasedDeadLetterQueueReconsumer\n(Read from DLQ)"]; |
| 19 | + Reshuffle [label="Reshuffle\n(Random Key)"]; |
| 20 | + TransformEvents [label="Apply Transformation to events"]; |
| 21 | + WriteSpanner [label="Write events to Cloud Spanner"]; |
| 22 | + WriteFiltered [label="Write Filtered Events"]; |
| 23 | + WriteDLQRetry [label="Write To DLQ\n(Retryable Errors)"]; |
| 24 | + WriteDLQSevere [label="Write To DLQ2\n(Severe Errors)"]; |
| 25 | + } |
| 26 | + |
| 27 | + Datastream -> GCS [label=" Change Events"]; |
| 28 | + GCS -> ReadDataStream; |
| 29 | + Spanner -> ProcessSchema [label=" DDL"]; |
| 30 | + ProcessSchema -> TransformEvents [label=" SideInput: DDL View", style=dotted]; |
| 31 | + ProcessSchema -> WriteSpanner [label=" SideInput: DDL View", style=dotted]; |
| 32 | + DLQ -> ReadDLQ [label=" Failed Events"]; |
| 33 | + |
| 34 | + ReadDataStream -> Reshuffle; |
| 35 | + ReadDLQ -> Reshuffle [label=" Retryable Events"]; |
| 36 | + ReadDLQ -> WriteDLQSevere [label=" Permanent Errors"]; |
| 37 | + |
| 38 | + Reshuffle -> TransformEvents [label=" JSON Records"]; |
| 39 | + TransformEvents -> WriteFiltered [label=" Filtered Events"]; |
| 40 | + WriteFiltered -> FilteredEventsGCS; |
| 41 | + TransformEvents -> WriteSpanner [label=" Transformed Events"]; |
| 42 | + TransformEvents -> WriteDLQSevere [label=" Permanent Errors"]; |
| 43 | + |
| 44 | + WriteSpanner -> Spanner [label=" Spanner Mutations"]; |
| 45 | + WriteSpanner -> WriteDLQRetry [label=" Retryable Errors"]; |
| 46 | + WriteSpanner -> WriteDLQSevere [label=" Permanent Errors"]; |
| 47 | + |
| 48 | + WriteDLQRetry -> DLQ; |
| 49 | + WriteDLQSevere -> DLQ; |
| 50 | +} |
0 commit comments