Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Why not pull consumer for NATS? #1573

Open
geekox86 opened this issue Aug 11, 2024 · 7 comments
Open

Why not pull consumer for NATS? #1573

geekox86 opened this issue Aug 11, 2024 · 7 comments

Comments

@geekox86
Copy link

Greetings,

Out of curiosity, why you did not use a Pull Consumer for NATS since it has better flow control, failure handling, and are more efficient for horizontal scalability?

Regards,

Mohannad

@yang-xiaodong
Copy link
Member

Pull Consumer not support queue group

@geekox86
Copy link
Author

geekox86 commented Aug 12, 2024

Hi. AFAIK, pull consumers support load balancing over multiple clients consuming from the same consumer; essentially, giving the same Competing Consumers pattern by queue group.

I also asked in the NATS .NET (v2) client library repo, and one of the maintainers mentioned that all their consumers are pull-based now by default.

@yang-xiaodong
Copy link
Member

yang-xiaodong commented Aug 13, 2024

Hi @geekox86 ,

Do you know how to achieve the equivalent behavior of the line of code
js.PushSubscribeAsync(subject, groupName, SubscriptionMessageHandler, false, pso);
using js.PullSubscribeAsync?

I couldn't find a queue parameter to pass in the PullSubscribeAsync method.

@geekox86
Copy link
Author

geekox86 commented Aug 13, 2024

The new API of NATS clients including .NET client go like this:

await using var nats = new NatsConnection();
var js = new NatsJSContext(nats);

// Assuming the pull consumer was created previously like this:
//     var consumer = await js.CreateOrUpdateConsumerAsync(stream: "orders", new ConsumerConfig
//     {
//         Name = "order_processor",
//         DurableName = "order_processor",
//     });
// Running this code by multiple processors will automatically make them competing consumers by NATS.
// I got this information fom https://www.youtube.com/watch?v=_CN1OO7yN0I&list=PLgqCaaYodvKZ0JDTEOryCoJDeLVNvMWpj

var consumer = await js.GetConsumerAsync(stream: "orders", consumer: "order_processor");

await foreach (var msg in consumer.ConsumeAsync<Order>(serializer: orderSerializer).WithCancellation(cancellationToken))
{
    // Process message here

    await msg.AckAsync();
}

Would you consider pull-based consumers?

@geekox86
Copy link
Author

@yang-xiaodong Hi again, just checking of what do you think dear?

@yang-xiaodong
Copy link
Member

@geekox86 This requires migrating the NATS client library to v2 first, would you be willing to submit a PR?

@yang-xiaodong
Copy link
Member

Note: Waiting for Nats.net client to implement push-based consumers, pull-based consumers do not support fanout.

nats-io/nats.net#686

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants