Skip to content

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

for pod in source-a source-b aggregator sink; do
  cd ${pod}/app/ && docker build -t serial-app-wosp-node:latest . && k3d image import serial-app-wosp-node:latest
  cd ../..
done
bash deploy.sh
bash deploy.sh

Verify

kubectl logs -n armored-trawler-source-a-ns \
  deployment/source-a -c web-app -f

Expected output:

🔁 Auto-trigger starting — sending 5 messages
🔁 Auto-trigger complete — 5/5 messages sent.

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) — in source-a/app/app.py and source-b/app/app.py: validation, initial payload construction
  • on_aggregate(partials) — in aggregator/app/app.py: merge the list of N partial results into a single output
  • on_receive_terminator(payload) — in sink/app/app.py: process the aggregated result

See Hook Functions Reference.

Pricing

3 WoSP units (1 per pod). See Commercial Licensing.