Understanding Distributed Locks: Use Cases, Benefits, and Implementation

Understanding Distributed Locks: Use Cases, Benefits, and Implementation Distributed locks play a vital role in ensuring safe and synchronized access to shared resources in distributed systems. Let’s explore when and why to use distributed locks, their benefits, and practical implementation examples. 1. Introduction to Distributed Locks A distributed lock ensures that only one process or service can access a shared resource at a time, even in a system with multiple nodes. For example, you can use distributed locks to: ...

March 15, 2025 · 3 min · TC

Understanding FetchXML: Breaking Down a Query Example

Understanding FetchXML: Breaking Down a Query Example FetchXML is a powerful XML-based query language for retrieving data from Microsoft Dataverse. Let’s break down a sample FetchXML query and understand its components. FetchXML Query <fetch> <entity name='contact'> <attribute name='fullname' /> <attribute name='emailaddress1' /> <link-entity name='account' from='accountid' to='parentcustomerid' alias='account'> <filter> <condition attribute='accountid' operator='eq' value='ACCOUNT_ID' /> </filter> </link-entity> </entity> </fetch> Explanation of Components <fetch>: The root element of the query, containing the definition of what data to retrieve. <entity>: Defines the primary entity for the query. In this example: ...

March 15, 2025 · 2 min · Taner

Updated Implementation Using `System.Text.Json`

Updated Implementation Using System.Text.Json using System; using System.Text.Json; using System.Text.Json.Serialization; public abstract class MessageEnvelope<T> { // Properties remain immutable public string EventType { get; private init; } public string SourceService { get; private init; } public DateTime Timestamp { get; private init; } public Guid TraceId { get; private init; } public T Payload { get; private init; } // Private constructor for builder use only private MessageEnvelope() { } public static Builder CreateBuilder() => new Builder(); // Serialization to JSON public string ToJson() { var options = new JsonSerializerOptions { WriteIndented = true // Makes the output JSON easier to read }; return JsonSerializer.Serialize(this, options); } // Deserialization from JSON public static MessageEnvelope<T> FromJson(string json) { var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true // Handles case differences in JSON properties }; return JsonSerializer.Deserialize<ConcreteMessageEnvelope>(json, options); } // Concrete implementation example for proper deserialization private class ConcreteMessageEnvelope : MessageEnvelope<T> { } public class Builder { private readonly MessageEnvelope<T> _envelope = new ConcreteMessageEnvelope(); public Builder WithEventType(string eventType) { _envelope.EventType = eventType; return this; } public Builder WithSourceService(string sourceService) { _envelope.SourceService = sourceService; return this; } public Builder WithPayload(T payload) { _envelope.Payload = payload; return this; } public Builder WithTimestamp(DateTime timestamp) { _envelope.Timestamp = timestamp; return this; } public Builder WithTraceId(Guid traceId) { _envelope.TraceId = traceId; return this; } public MessageEnvelope<T> Build() { _envelope.Timestamp = _envelope.Timestamp == default ? DateTime.UtcNow : _envelope.Timestamp; _envelope.TraceId = _envelope.TraceId == default ? Guid.NewGuid() : _envelope.TraceId; return _envelope; } } } Example Usage 1. Serialize a MessageEnvelope to JSON var envelope = MessageEnvelope<Reservation> .CreateBuilder() .WithEventType("ReservationExpiry") .WithSourceService("ReservationService") .WithPayload(new Reservation { ReservationId = "res-001", SlotId = "slot-123", ExpiryTime = DateTime.UtcNow }) .Build(); string serialized = envelope.ToJson(); Console.WriteLine($"Serialized Envelope:\n{serialized}"); 2. Deserialize a JSON String to MessageEnvelope string json = "{\"EventType\":\"ReservationExpiry\",\"SourceService\":\"ReservationService\",\"Timestamp\":\"2025-03-25T17:00:00Z\",\"TraceId\":\"8a1db2c2-ec3e-45f7-a3eb-bd9dfb351245\",\"Payload\":{\"ReservationId\":\"res-001\",\"SlotId\":\"slot-123\",\"ExpiryTime\":\"2025-03-25T17:00:00Z\"}}"; var deserializedEnvelope = MessageEnvelope<Reservation>.FromJson(json); Console.WriteLine($"Deserialized EventType: {deserializedEnvelope.EventType}"); Console.WriteLine($"Deserialized Reservation ID: {deserializedEnvelope.Payload.ReservationId}"); Benefits of Serialization Portability: You can transmit envelopes as JSON over APIs, message brokers, or store them in databases. Interoperability: Many systems can parse JSON, making serialized envelopes easy to integrate across platforms. Flexibility: Deserialization lets you reconstruct envelopes when receiving messages. Advantages of System.Text.Json Performance: Faster than Newtonsoft.Json, especially for large-scale applications. Built-in Support: No need for external dependencies; it’s natively part of .NET Core and .NET 5+. Configuration Options: Flexible JSON options like camel casing, case insensitivity, and indented formatting.

March 15, 2025 · 2 min · Taner

Implementing the Clock-Bound Wait Pattern in C#

Implementing the Clock-Bound Wait Pattern in C# The Clock-Bound Wait pattern is a critical technique in distributed systems to ensure consistency across nodes. Here are some C# code examples that demonstrate this pattern, using a simple distributed system where each node synchronizes its clock before performing read and write operations. 1. Determine Maximum Clock Offset Define a Clock class to determine the maximum clock offset and get the synchronized time. ...

February 23, 2025 · 3 min · TC

Using Wolverine to Delay Messages in C#

Using Wolverine to Delay Messages in C# Wolverine’s feature for delaying messages can be a great alternative to using Task.Delay. Below, I’ll show you how to modify the solution to use Wolverine’s delayed messaging capabilities. 1. Setup Wolverine with Delayed Messaging Make sure you have the Wolverine NuGet package installed. dotnet add package Wolverine 2. Create a Wolverine Configuration with Delayed Messaging Configure Wolverine to handle delayed messaging. using Wolverine; using Microsoft.Extensions.Hosting; public class WolverineConfig : IWolverineRegistry { public void Configure(IWolverineOptions options) { options.PublishAllMessages().ToRabbitMq("rabbitmq://localhost"); options.ListenToRabbitMq("rabbitmq://localhost").QueueName("writeQueue"); } } 3. Modify WriteOperation Class Publish a delayed message using Wolverine after synchronizing the time. ...

February 23, 2025 · 2 min · TC