From 4b8ca5658e1690d609bfa979ed283a8156c9325e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Nov 2025 16:34:37 +0000 Subject: [PATCH 1/4] Initial plan From cdfc26e766f3077ac8ad1777c6a155e4e2e5b47e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Nov 2025 16:38:24 +0000 Subject: [PATCH 2/4] Add README.md for Orleans.Streaming.NATS package Co-authored-by: ReubenBond <203839+ReubenBond@users.noreply.github.com> --- src/Orleans.Streaming.NATS/README.md | 135 +++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/Orleans.Streaming.NATS/README.md diff --git a/src/Orleans.Streaming.NATS/README.md b/src/Orleans.Streaming.NATS/README.md new file mode 100644 index 00000000000..b9ba2f20457 --- /dev/null +++ b/src/Orleans.Streaming.NATS/README.md @@ -0,0 +1,135 @@ +# Microsoft Orleans Stream Provider for NATS + +## Introduction +Microsoft Orleans Stream Provider for NATS enables Orleans applications to leverage NATS JetStream for reliable, scalable event processing. This provider allows you to use NATS JetStream as a streaming backbone for your Orleans application to both produce and consume streams of events. + +## Getting Started +To use this package, install it via NuGet: + +```shell +dotnet add package Microsoft.Orleans.Streaming.NATS +``` + +## Example - Configuring NATS Stream Provider + +```csharp +using Microsoft.Extensions.Hosting; +using Orleans.Hosting; +using Orleans.Streaming.NATS.Hosting; + +var builder = Host.CreateApplicationBuilder(args) + .UseOrleans(siloBuilder => + { + siloBuilder + .UseLocalhostClustering() + // Configure NATS JetStream as a stream provider + .AddNatsStreams( + "NatsStreamProvider", + options => + { + options.StreamName = "orleans-stream"; + // Optional: Configure NATS client options + // options.NatsClientOptions = new NatsOpts { Url = "nats://localhost:4222" }; + // Optional: Configure batch size (default: 100) + // options.BatchSize = 100; + // Optional: Configure partition count (default: 8) + // options.PartitionCount = 8; + }); + }); + +// Run the host +await builder.RunAsync(); +``` + +## Example - Configuring NATS Streams on Client + +```csharp +using Microsoft.Extensions.Hosting; +using Orleans.Streaming.NATS.Hosting; + +var builder = Host.CreateApplicationBuilder(args) + .UseOrleansClient(clientBuilder => + { + clientBuilder + .UseLocalhostClustering() + .AddNatsStreams( + "NatsStreamProvider", + options => + { + options.StreamName = "orleans-stream"; + }); + }); + +await builder.RunAsync(); +``` + +## Example - Using NATS Streams in a Grain + +```csharp +using Orleans; +using Orleans.Streams; + +// Grain interface +public interface IStreamProcessingGrain : IGrainWithGuidKey +{ + Task StartProcessing(); + Task SendEvent(MyEvent evt); +} + +// Grain implementation +public class StreamProcessingGrain : Grain, IStreamProcessingGrain +{ + private IStreamProvider _streamProvider; + private IAsyncStream _stream; + private StreamSubscriptionHandle _subscription; + + public override async Task OnActivateAsync(CancellationToken cancellationToken) + { + // Get the stream provider + _streamProvider = this.GetStreamProvider("NatsStreamProvider"); + + // Get a reference to a specific stream + _stream = _streamProvider.GetStream( + streamId: StreamId.Create("MyStreamNamespace", this.GetPrimaryKey())); + + await base.OnActivateAsync(cancellationToken); + } + + public async Task StartProcessing() + { + // Subscribe to the stream to process events + _subscription = await _stream.SubscribeAsync(OnNextAsync); + } + + private Task OnNextAsync(MyEvent evt, StreamSequenceToken token) + { + Console.WriteLine($"Received event: {evt.Data}"); + return Task.CompletedTask; + } + + // Produce an event to the stream + public Task SendEvent(MyEvent evt) + { + return _stream.OnNextAsync(evt); + } +} + +// Event class +public class MyEvent +{ + public string Data { get; set; } +} +``` + +## Documentation +For more comprehensive documentation, please refer to: +- [Microsoft Orleans Documentation](https://learn.microsoft.com/dotnet/orleans/) +- [Orleans Streams](https://learn.microsoft.com/en-us/dotnet/orleans/streaming/) +- [NATS JetStream Documentation](https://docs.nats.io/nats-concepts/jetstream) + +## Feedback & Contributing +- If you have any issues or would like to provide feedback, please [open an issue on GitHub](https://github.com/dotnet/orleans/issues) +- Join our community on [Discord](https://aka.ms/orleans-discord) +- Follow the [@msftorleans](https://twitter.com/msftorleans) Twitter account for Orleans announcements +- Contributions are welcome! Please review our [contribution guidelines](https://github.com/dotnet/orleans/blob/main/CONTRIBUTING.md) +- This project is licensed under the [MIT license](https://github.com/dotnet/orleans/blob/main/LICENSE) From 9eb5484a62b1ff70a60d5c8e6763594408900a5a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Nov 2025 16:39:58 +0000 Subject: [PATCH 3/4] Fix StreamId.Create call in NATS README example Co-authored-by: ReubenBond <203839+ReubenBond@users.noreply.github.com> --- src/Orleans.Streaming.NATS/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Orleans.Streaming.NATS/README.md b/src/Orleans.Streaming.NATS/README.md index b9ba2f20457..52e9b2e20c7 100644 --- a/src/Orleans.Streaming.NATS/README.md +++ b/src/Orleans.Streaming.NATS/README.md @@ -90,7 +90,7 @@ public class StreamProcessingGrain : Grain, IStreamProcessingGrain // Get a reference to a specific stream _stream = _streamProvider.GetStream( - streamId: StreamId.Create("MyStreamNamespace", this.GetPrimaryKey())); + StreamId.Create("MyStreamNamespace", this.GetPrimaryKey())); await base.OnActivateAsync(cancellationToken); } From e2feccea5188c67fe526e146f2d03df0b0a23918 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Nov 2025 16:51:48 +0000 Subject: [PATCH 4/4] Include README.md in NuGet package for Orleans.Streaming.NATS Co-authored-by: ReubenBond <203839+ReubenBond@users.noreply.github.com> --- src/Orleans.Streaming.NATS/Orleans.Streaming.NATS.csproj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Orleans.Streaming.NATS/Orleans.Streaming.NATS.csproj b/src/Orleans.Streaming.NATS/Orleans.Streaming.NATS.csproj index 52cc20c8482..937057b8da5 100644 --- a/src/Orleans.Streaming.NATS/Orleans.Streaming.NATS.csproj +++ b/src/Orleans.Streaming.NATS/Orleans.Streaming.NATS.csproj @@ -12,6 +12,7 @@ enable $(VersionSuffix).alpha.1 alpha.1 + README.md @@ -22,4 +23,8 @@ + + + +