Armored Trawler — Result Collector¶
A fan-in architecture that waits for parallel upstream processes and aggregates their results into a single payload. Fully protected by per-request Layer 7 encryption.
Tags: Armored Car | Single Cluster | HTTP1/REST | 3 Pods
Overview¶
The Armored Trawler collects from two independent Gateway/Initiator pods (http-gateway) and combines their outputs via an Aggregator (http-fan-in), which forwards the combined result to a Sink/Terminator (http-sink).
The Aggregator waits until all N upstream messages arrive (INGRESS_COUNT=2) before forwarding — it holds partial results in memory until the set is complete. Armored Car mode (xtra7) provides per-request key rotation on all hops.
flowchart TD
A["Gateway / Initiator\n(http-gateway)\nsource-a"]
B["Gateway / Initiator\n(http-gateway)\nsource-b"]
C["Aggregator\n(http-fan-in)"]
D["Sink / Terminator\n(http-sink)"]
A -->|"WoSP xtra7"| C
B -->|"WoSP xtra7"| C
C -->|"WoSP xtra7"| D Use Cases¶
- Collecting results from parallel upstream services before proceeding
- Scatter/gather patterns where N tasks run in parallel and the result is their union
- Waiting for confirmations from multiple systems before dispatching downstream
- Aggregating metrics or events from independent sources
Bundle Contents¶
armored-trawler/
├── source-a/ ← http-gateway (boundary)
├── source-b/ ← http-gateway (boundary)
├── aggregator/ ← http-fan-in (internal, INGRESS_COUNT=2)
├── sink/ ← http-sink (boundary)
├── deploy.sh
├── teardown.sh
├── pinhole-setup.sh
├── blueprint.yaml
├── README.md
└── EULA.md
Deploy¶
Prerequisites: Docker Desktop, k3d >= 5.0, kubectl, valid Hopr license
Verify¶
Expected output:
Confirm aggregated delivery:
kubectl port-forward -n armored-trawler-sink-ns deployment/sink 8000:8000
curl http://localhost:8000/output
Expected: {"count": 5, "results": [...]}. Each result contains the combined payload from both sources.
Customize¶
Hook functions for this blueprint:
on_trigger(payload, headers)— insource-a/app/app.pyandsource-b/app/app.py: validation, initial payload constructionon_aggregate(partials)— inaggregator/app/app.py: merge the list of N partial results into a single outputon_receive_terminator(payload)— insink/app/app.py: process the aggregated result
Pricing¶
3 WoSP units (1 per pod). See Commercial Licensing.