LightningQueues
$ dotnet add package LightningQueuesLightningQueues is a high-performance, lightweight, store-and-forward message queue for .NET applications. Powered by LightningDB (LMDB), it ensures fast and durable persistence for sending and receiving messages, making it an excellent choice for lightweight and cross-platform message queuing needs.
To use LightningQueues, add it to your .NET project via NuGet:
dotnet add package LightningQueues
Here’s how to use LightningQueues to set up a message queue and send a message:
using LightningQueues;
// Define queue location and create the queue
var queue = new QueueConfiguration()
.WithDefaults("C:\\path_to_your_queue_folder")
.BuildAndStart("queue-name");
// Send a message to the queue
var message = new Message
{
Data = "hello"u8.ToArray(),
Id = MessageId.GenerateRandom(), //source identifier (for the server instance) + message identifier
Queue = "queue-name",
Destination = new Uri("lq.tcp://localhost:port")
//Note the uri pattern, can be DNS, loopback, etc.
};
queue.Send(message);
// Start receiving messages asynchronously with IAsyncEnumerable<MessageContext>
var messages = queue.Receive("queue-name", token);
await foreach (var msg in messages)
{
//process the message and respond with one or more of the following
msg.QueueContext.ReceiveLater(TimeSpan.FromSeconds(1));
msg.QueueContext.SuccessfullyReceived(); //nothing more to do, done processing
msg.QueueContext.Enqueue(msg.Message); //ideally a new message enqueued to the queue name on the msg
msg.QueueContext.Send(msg.Message); //send a response or send a message to another uri;
msg.QueueContext.MoveTo("different-queue"); //moves the currently received message to a different queue
msg.QueueContext.CommitChanges(); // Everything previous is gathered in memory and committed in one transaction with LightningDB
}
To ensure everything is running smoothly, clone the repository and run:
dotnet test
LightningQueues supports TLS encryption to secure communication. The library provides hooks to enable custom certificate validation and encryption settings. For example:
var certificate = LoadYourCertificate();
configuration.SecureTransportWith(new TlsStreamSecurity(async (uri, stream) =>
{
//client side with no validation of server certificate
var sslStream = new SslStream(stream, true, (_, _, _, _) => true, null);
await sslStream.AuthenticateAsClientAsync(uri.Host);
return sslStream;
}),
new TlsStreamSecurity(async (_, stream) =>
{
var sslStream = new SslStream(stream, false);
await sslStream.AuthenticateAsServerAsync(certificate, false,
checkCertificateRevocation: false, enabledSslProtocols: SslProtocols.Tls12);
return sslStream;
}));
You can customize the encryption level based on your requirements.
Licensed under the MIT license.