GitHunt
MC

mcawalsh/functionapp-purchase-processor

Local Azure Function pipeline demo using Azurite queues to process purchase messages.

🧾 Purchase Processing Pipeline (Azure Functions + Azurite)

A simple event-driven sample demonstrating how to process queue messages locally using Azure Functions and the Azurite Storage Emulator.

This project simulates a lightweight purchase processing flow entirely on your local machine β€” perfect for experimenting with queue triggers and output bindings.


🧱 Architecture Overview

Azurite Queue (purchases)
        ↓
Azure Function (ProcessPurchase)
        ↓
Azurite Queue (purchases-processed)
  • QueueMessageSender – Console app that sends purchase messages to the purchases queue.

  • PurchaseProcessor – Azure Function project that processes messages and writes results to the purchases-processed queue.

βš™οΈ Prerequisites

  • .NET 8 SDK
  • Azurite
    (VS Code extension or Docker)
  • Azure Functions Core Tools v4
  • Azure Storage Explorer
    (optional, for viewing queues)

πŸš€ Getting Started

1. Start Azurite: VS Code extension

Press Ctrl+Shift+P β†’ Azurite: Start

2. Run the QueueMessageSender

This console app creates and sends mock purchase messages to Azurite.

cd QueueMessageSender
dotnet build
dotnet run

You’ll be prompted for:

  • Customer name
  • Number of items
  • Name, quantity, and price for each item

A message is then sent to the purchases queue.

3. Start the Function App

The function listens for new messages on the purchases queue, processes them, and outputs to purchases-processed.

cd PurchaseProcessor
func start

If you’re running plain JSON (not Base64), make sure your host.json includes:

{
  "version": "2.0",
  "extensions": {
    "queues": {
      "messageEncoding": "none"
    }
  }
}

4. View Messages

Use Azure Storage Explorer to connect to your local Azurite instance and inspect both queues:

  • purchases – input queue
  • purchases-processed – processed output messages

🧩 How It Works

  1. QueueMessageSender sends a JSON message like:
{
  "PurchaseId": "43ecd0e5-7f2d-4c5a-a5bc-9877783a61bf",
  "CustomerId": "Customer-Id-01",
  "Items": [
    { "Name": "Book", "Quantity": 1, "Price": 9.99 }
  ],
  "Timestamp": "2025-11-06T14:27:47.4503265Z"
}
  1. The Function App:
  • Logs receipt of the message
  • Deserializes the JSON
  • Adds a processed timestamp
  • Writes the updated record to purchases-processed

⚠️ Notes

  • If message processing fails more than 5 times, it’s automatically moved to a poison queue named purchases-poison.
  • Both input and output queues are fully emulated in Azurite β€” no Azure resources required.

🧰 Project Structure

.
β”œβ”€β”€ QueueMessageSender/      # Console app to send queue messages
β”œβ”€β”€ PurchaseProcessor/       # Azure Function project
β”‚   β”œβ”€β”€ ProcessPurchase.cs   # Queue trigger function
β”‚   └── host.json            # Function host configuration
└── README.md

🏁 Summary

This project demonstrates a local-first, event-driven workflow using:

  • Azurite for queue emulation
  • Azure Functions (in-process model)
  • A simple console producer and consumer pattern

It’s a great foundation for experimenting with Azure Functions, message processing, and building local prototypes before deploying to the cloud.