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

FEATURE: Consumer prefetch update? #221

Closed
mortiy opened this issue Jul 25, 2023 · 7 comments
Closed

FEATURE: Consumer prefetch update? #221

mortiy opened this issue Jul 25, 2023 · 7 comments

Comments

@mortiy
Copy link

mortiy commented Jul 25, 2023

Hi @cressie176,
Is there any possible/recommended way I can update existing subscription settings, like prefetch?

@cressie176
Copy link
Collaborator

Hi @mortiy,

I don't believe it is possible to change a consumer specific prefetch with the AMQP. The only way would be to cancel the consumer and re-consume, specifying the new prefetch value, e.g.

const subscription1 = await broker.subscribe('s1', { prefetch: 1 });
await subscription1.cancel();
const subscription2 = await broker.subscribe('s1', { prefetch: 2 });

If you use a channel level prefetch it is possible with AMQP, but not with Rascal since it uses a channel pool.

@mortiy
Copy link
Author

mortiy commented Jul 25, 2023

Got it, thank you.

@mortiy mortiy closed this as completed Jul 25, 2023
@cressie176
Copy link
Collaborator

Sorry @mortiy, I just realised I was wrong with the comment about channel pooling - this is only when publishing messages. Rascal users a single channel per consumer, so it might actually be possible to update it. Let me check

@cressie176 cressie176 reopened this Jul 25, 2023
@cressie176
Copy link
Collaborator

I think it will be possible with the addition of a new method on the subscription and some other changes. e,g,

const subscription = await broker.subscribe('s1', { prefetch: 1 });
subscription.setPrefetch(2);

The catch is that for this to work, I will have to change Rascal's existing mode of consumer level prefetch to channel level prefetch. I think this will be OK since Rascal does not share channels between consumers.

I also don't think it makes sense to support changing any other subscriber options. Do you agree?

@mortiy
Copy link
Author

mortiy commented Jul 25, 2023

I think this will be OK since Rascal does not share channels between consumers.

Sounds good for me.

I also don't think it makes sense to support changing any other subscriber options. Do you agree?

I don't have any other options that I'm willing to change, so yes, that should work.

@cressie176
Copy link
Collaborator

cressie176 commented Jul 25, 2023

I've read up on Consumer Prefetch and things aren't quite as straight forward as I had hoped. According to the docs, setting a channel level prefetch causes consumption to be slow, especially in a clustered environment. I'm not sure if this is still true when using an explicit channel per consumer, but suspect it might be. Therefore it wouldn't be safe to change Rascal to set a channel level prefetch.

However, it is possible to specify both a channel and consumer level prefetch, in which case both will be honoured. So I could provide a subscription.setPrefetch(i); method which you could use to override the consumer level prefetch if you did not want to go to the trouble of cancelling the consumer, albeit at a potential performance cost. However, this could only ever be used to reduce the preset from the initial consumer level one, but never to increase it since both would remain in effect.

Overall, I'm not sure the risk of an unexpected (if someone didn't RTFM) performance penalty is worth the trouble, so will give it some more thought.

@cressie176
Copy link
Collaborator

Will be published shortly as v17.
Docs here - https://github.com/onebeyond/rascal#channelprefetch

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

No branches or pull requests

2 participants