RSSAmplifier

Blog

Mehdi Hadeli Tech

mehdihadeli.comRSS feed ↗24 posts

Latest posts

Distributed Transactions with Wolverine: Saga Orchestration vs Choreography with RabbitMQ, Compensating Actions, and Timeout Handling

Learn both Saga implementation styles — orchestration and choreography — using Wolverine and RabbitMQ. Covers saga state management, compensating transactions, timeout handling, comparison, and integration tests with TestContainers.

Concurrency Control in .NET: From Local Locks to Distributed Systems

A hands-on guide to four concurrency control strategies in .NET: NoLock, LocalLock, Optimistic, and Distributed (Redis RedLock), built with Vertical Slice Architecture and MediatR.

End-to-End Observability in .NET with Aspire, OpenTelemetry, and the LGTM Stack

A complete walkthrough of wiring up distributed tracing, metrics, and structured logging for a .NET microservices application using OpenTelemetry, the OpenTelemetry Collector, Prometheus, Tempo, Loki, Grafana, and an optional ELK stack sidecar.

MassTransit Transactional Messaging with .NET Aspire, RabbitMQ, Kafka, PostgreSQL, MongoDB, Outbox, Inbox, Retry, Error Queues, and Dead-Letter Handling

Build a .NET Aspire sample that uses MassTransit with RabbitMQ or Kafka, PostgreSQL transactional outbox and inbox state, retry, MassTransit error handling, broker-native dead-letter handling, and post-commit internal processing to update MongoDB after the write-side transaction commits.

Wolverine Transactional Messaging with .NET Aspire, RabbitMQ, PostgreSQL, MongoDB, Inbox, Outbox, and Durable Local Processing

Build a .NET Aspire sample that uses Wolverine with RabbitMQ or Kafka, PostgreSQL transactional outbox and inbox behavior, and durable local processing to update MongoDB after the write-side transaction commits.

Running vLLM on a Small Home Lab with Docker Compose

A detailed CPU-only guide to running Qwen3-0.6B with vLLM on a Core i5 home lab using Docker Compose, health checks, Prometheus, Grafana, Jaeger tracing, and realistic low-resource tuning.

Designing a DevSecOps GitHub Actions Pipeline for .NET: Quality, SAST, SCA, Signing, and DAST

A practical .NET DevSecOps GitHub Actions design that splits CI and CD, layers quality gates, local Husky hooks, Checkov, Semgrep, CodeQL, optional Sonar, Microsoft Testing Platform coverage with Cobertura and Coveralls, SBOM generation, Cosign signing, provenance attestation, automatic main-to-dev deployment, tag-to-staging promotion, and manual-gated production release with smoke, k6, and ZAP…

Make vs Just vs Mise vs go-task for .NET Apps in 2026

A grounded comparison of Make, Just, Mise, and go-task for a .NET appss in 2026, with equivalent task files, tradeoffs, and a clear winner.

The Complete Guide to Secret Rotation in .NET Microservices with HashiCorp Vault Agent: From VaultSharp to Zero-Downtime Sidecar

Learn how to rotate PostgreSQL and RabbitMQ credentials in .NET microservices, why VaultSharp and env-var injection break down, and how Vault Agent plus reloadable appsettings.json gives you zero-downtime secret rotation.

Designing a Practical Versioning Strategy for Development, Staging, and Production with SemVer and Nerdbank.GitVersioning

A practical guide to structuring preview, release candidate, and production versions with Semantic Versioning, Nerdbank.GitVersioning, and GitHub Actions.

Repo Registry for GitHub Copilot CLI: A Dedicated MCP Server for Multi-Repo .NET Work

Build a dedicated MCP repo registry for GitHub Copilot CLI so it can query live Git state, repo metadata, and cross-repo dependency relationships in one place.

Per-Service Copilot Instructions for GitHub Copilot CLI: Keep Service Rules Close to the Repo

Keep repo-specific Copilot instructions close to each service so local invariants, generated-code boundaries, and validation steps stay with the code that owns them.

Multi-Repo Workspace Setup for GitHub Copilot CLI: Context Across .NET Service Boundaries

Set up a shared workspace root for GitHub Copilot CLI so it can understand cross-repo .NET changes, repo ownership, and change order across service boundaries.

Build a Research Agent with Web Search in .NET: Structured Briefs Before Writing

Build a .NET research agent that turns web search into a structured, typed brief before any prose is written, using Microsoft Agent Framework and replaceable search boundaries.

Shared Features in Claude Code and GitHub Copilot: What You Can Reuse and What Still Needs Separate Settings

Compare what Claude Code and GitHub Copilot can actually share in a repository, and where separate wrappers, rules, settings, and MCP files are still required.

Choosing the Right Caching Strategy in .NET 9

In this blog post, we explain popular caching strategies in .NET 9, including cache-aside, read-through, write-through, and write-behind—and introduce the new HybridCache feature. Learn how to choose and implement the best caching approach for your application’s speed, scalability, and consistency needs.

Optimistic vs. Pessimistic Concurrency In .NET: Complete Guide with Examples

Learn the key differences between optimistic and pessimistic concurrency control in .NET, their pros & cons, and when to use each. This complete guide includes practical examples to help you manage data conflicts effectively in your applications.

Concurrency vs. Parallelism in .NET: A Practical Guide

Discover the essential differences between concurrency and parallelism in .NET, and learn when to use each for maximum performance. This post explores practical patterns, real-world examples, and best practices to help you write efficient, high-throughput applications using modern .NET techniques.

How to Choose the Right C# Collection

In this blog post, we will explain how to choose the right C# collection for your needs by outlining the key features and use cases of popular types like lists, dictionaries, and hash sets. You’ll learn when to use each collection to ensure your code is efficient and easy to maintain.

Solid Principles In Depth

A deep dive into the SOLID principles—SRP, OCP, LSP, ISP, and DIP—exploring object-oriented design with clear explanations, real-world examples.

Evolution of ProblemDetails: From .NET Core 2.2 to .NET 9

This article traces the remarkable journey of error handling in .NET from its early days in .NET Core 2.2 through to the upcoming .NET 9. We explore how Microsoft transformed basic exception management into a sophisticated, standardized system.

Horizontal Scaling In MongoDB With Replication

In today’s fast-paced digital landscape, the ability to scale your applications efficiently is crucial for success. In this blog post, we delve into the concept of horizontal scaling with MongoDB, a powerful NoSQL database known for its flexibility and scalability.

Implementing Publisher Confirms in .Net Core with RabbitMQ

If you’re developing a.NET Core console application, you might notice that it lacks support out of the box for crucial features like dependency injection, logging, and [configuration]. But by using these strategies, you can organize your console application and make it simpler to maintain, just like in an ASP.NET Core application.

How to Implement Dependency Injection for .Net Core Console Applications

If you’re developing a.NET Core console application, you might notice that it lacks support out of the box for crucial features like dependency injection, logging, and [configuration]. But by using these strategies, you can organize your console application and make it simpler to maintain, just like in an ASP.NET Core application.