The two modules
Runtime components
The pipeline
Inbound protocols create one internal message and enqueue it. Router threads evaluate the routing table and enqueue into one or more worker queues. Worker threads do the protocol-specific delivery.Where state lives
Two of those are worth knowing precisely:
The receipt store is the only persistent state outside PostgreSQL. It remembers which vendor
message id belongs to which submission, and holds receipts for a client that has disconnected. See
the store settings.
Reserved credit is in memory. Credit is handed out to a worker in blocks and spent from a counter,
so there is no database write on the message path. A clean shutdown returns what is unspent; a
kill -9 strands it until fireflo credit release runs. balance + reserved
is conserved either way.
Both directions
FireFlo is not only an outbound gateway.
Inbound message ownership is resolved by
mo.owner.map on the listener, and an unmapped message goes
nowhere rather than to a guess — see Listener settings.