TELS Quoting uses RabbitMQ via MassTransit 8.2.5 for asynchronous messaging. One subscriber service hosts two consumers processing 7 message types. The API publishes 6 event types via BusProxy.
Message Bus Architecture
Queue
Consumer
Messages
tels.bidding.mqservices
BiddingConsumer
5 message types (expiration, fairness, PDF gen)
tels.bidding.mqservices
WorkItemConsumer
2 message types (status, fulfillment)
Delivery Mechanism
Component
Purpose
Configuration
MassTransit 8.2.5
Consumer/publisher framework
RabbitMQ transport
RabbitMQ
Message broker
Multi-bus configuration
BusProxy
Outbound event publishing
TELS.BusProxy.Client 2.2.0 with S3 fallback
Consumed Events (Inbound)
IBidAccepted
Property
Value
Source
Self (API publishes on bid acceptance)
Queue
tels.bidding.mqservices
Consumer
BiddingConsumer
Contract
TELS.Bidding.Contracts.V1.Events
Trigger
A bid is accepted via the API
Action
Schedules a CheckForBidExpiration message for future expiration check
ICheckForBidExpiration
Property
Value
Source
Self (scheduled by BiddingConsumer on bid acceptance)
Queue
tels.bidding.mqservices
Consumer
BiddingConsumer
Contract
TELS.Bidding.Contracts.V1.Events
Trigger
Scheduled expiration check fires
Action
Expires the bid if expiration date has passed
IBidRevalidationExpiration
Property
Value
Source
Self (published with EarliestPublicationDate on revalidation)
API (on revalidation, with EarliestPublicationDate)
Delivery
BusProxy (S3 fallback)
Known Consumers
Self (expires bid at revalidation expiration)
GenerateBidFromPdfCommand
Property
Value
Source
API (on PDF upload)
Delivery
BusProxy (S3 fallback)
Known Consumers
Self (BiddingConsumer processes PDF extraction)
Message Flow Diagrams
Bid Lifecycle Flow
User creates/updates bid via API
-> Saves to PostgreSQL
-> Publishes BidModification via BusProxy
-> Queue: tels.bidding.mqservices
-> BiddingConsumer calculates fairness score
-> Updates bid with fairness_score and fairness_confidence
Bid Acceptance Flow
User accepts bid via API
-> Saves status change to PostgreSQL
-> Publishes BidAccepted, BidModification, BidStatusChanged via BusProxy
-> BiddingConsumer receives BidAccepted
-> Schedules CheckForBidExpiration for future date
-> (Later) CheckForBidExpiration fires
-> BiddingConsumer expires bid if past expiration date
PDF-to-Bid Flow
User uploads PDF via API
-> Saves generated_bids record (status: Submitted)
-> Publishes GenerateBidFromPdfCommand via BusProxy
-> Queue: tels.bidding.mqservices
-> BiddingConsumer processes:
1. Fetches PDF from Files Service
2. Extracts text via PdfPig
3. Calls LLM (AWS Bedrock/OpenAI) for structured extraction
4. Saves generated bid data (status: Completed/Failed)
5. Stores LLM chain-of-thought reasoning
Work Item Cancellation Flow
Work Items System
-> Publishes IStatusEventV1 (Status.Cancelled / Status.CustomerDeclined)
-> Queue: tels.bidding.mqservices
-> WorkItemConsumer cancels associated bids