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

Fix Consumer listener does not respect receiver queue size #11455

Merged
merged 4 commits into from
Aug 6, 2021

Conversation

Technoboy-
Copy link
Contributor

Fixes #11008

Documentation

This is a bug fix, and no need to update doc.

@Technoboy- Technoboy- changed the title Fix Consumer listener does not respect receiver queue size [Discuss] Fix Consumer listener does not respect receiver queue size Jul 27, 2021
@Anonymitaet Anonymitaet added the doc-not-needed Your PR changes do not impact docs label Jul 27, 2021
@sijie sijie added this to the 2.9.0 milestone Jul 28, 2021
@sijie sijie added area/client release/2.8.1 type/bug The PR fixed a bug or issue reported a bug release/2.7.4 labels Jul 28, 2021
@Technoboy- Technoboy- changed the title [Discuss] Fix Consumer listener does not respect receiver queue size Fix Consumer listener does not respect receiver queue size Jul 29, 2021
Copy link
Contributor

@hangc0276 hangc0276 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good job!

@Technoboy-
Copy link
Contributor Author

/pulsarbot run-failure-checks

@codelipenghui codelipenghui merged commit 09944d9 into apache:master Aug 6, 2021
LeBW pushed a commit to LeBW/pulsar that referenced this pull request Aug 9, 2021
hangc0276 pushed a commit that referenced this pull request Aug 12, 2021
@hangc0276 hangc0276 added the cherry-picked/branch-2.8 Archived: 2.8 is end of life label Aug 12, 2021
michaeljmarshall pushed a commit that referenced this pull request Dec 10, 2021
@michaeljmarshall michaeljmarshall added the cherry-picked/branch-2.7 Archived: 2.7 is end of life label Dec 10, 2021
nicoloboschi pushed a commit to datastax/pulsar that referenced this pull request Mar 17, 2022
)

Fixes  apache#11008

(cherry picked from commit 09944d9)
(cherry picked from commit 0a57e2c)
bharanic-dev pushed a commit to bharanic-dev/pulsar that referenced this pull request Mar 18, 2022
codelipenghui added a commit to codelipenghui/incubator-pulsar that referenced this pull request Apr 13, 2022
### Motivation

apache#13023 has introduced a performance regression.
For each message, we are switching from external thread pool -> internal thread poll -> external thread pool.

Previously we want to control the outstanding messages of a consumer which using listener, so after apache#11455,
the message will not move from the receiver queue to the external executor. And apache#13023 changed the listener trigger
in the internal thread pool to fixes the orderding issue, so this is the root cause of the performance regression.

Here is the framegraph to to show the thread frame of internal thread and external thread.

And also fix the performance issue for multiple topic consumer and key-shared subscription which enabled message listener.
Before this change, the messages are processed serially. After this change, We can improve parallelism on the premise of
ensuring ordering.

### Modification

- Remove the isListenerHandlingMessage control
- Move the messages from receiver queue to the queue of external executor but not increase permits
- Increase permits before call message listener

After the above changes, we don't need to call triggerListener from the external executor.

Here is the thread framegraph after apply this change

Before this change, the consumer can't reach 50000 messages/s.
After this change, the consumer can reach 400000 messages/s

```
2022-04-14T02:14:58,208+0800 [main] INFO  org.apache.pulsar.testclient.PerformanceConsumer - Throughput received: 9723124 msg --- 470142.670  msg/s --- 3.587 Mbit/s  --- Latency: mean: 9476.742 ms - med: 9441 - 95pct: 11908 - 99pct: 12152 - 99.9pct: 12239 - 99.99pct: 12247 - Max: 12247
2022-04-14T02:15:08,222+0800 [main] INFO  org.apache.pulsar.testclient.PerformanceConsumer - Throughput received: 14411888 msg --- 468147.684  msg/s --- 3.572 Mbit/s  --- Latency: mean: 15262.627 ms - med: 15253 - 95pct: 18023 - 99pct: 18258 - 99.9pct: 18315 - 99.99pct: 18317 - Max: 18318
2022-04-14T02:15:18,236+0800 [main] INFO  org.apache.pulsar.testclient.PerformanceConsumer - Throughput received: 18841513 msg --- 442446.540  msg/s --- 3.376 Mbit/s  --- Latency: mean: 21164.401 ms - med: 21094 - 95pct: 23664 - 99pct: 23899 - 99.9pct: 23939 - 99.99pct: 23955 - Max: 23955
2022-04-14T02:15:28,253+0800 [main] INFO  org.apache.pulsar.testclient.PerformanceConsumer - Throughput received: 23082078 msg --- 423212.525  msg/s --- 3.229 Mbit/s  --- Latency: mean: 27174.714 ms - med: 27272 - 95pct: 29453 - 99pct: 29698 - 99.9pct: 29725 - 99.99pct: 29736 - Max: 29736
2022-04-14T02:15:38,268+0800 [main] INFO  org.apache.pulsar.testclient.PerformanceConsumer - Throughput received: 27647013 msg --- 455823.127  msg/s --- 3.478 Mbit/s  --- Latency: mean: 32438.418 ms - med: 32410 - 95pct: 34870 - 99pct: 35098 - 99.9pct: 35130 - 99.99pct: 35133 - Max: 35134
```
codelipenghui added a commit to codelipenghui/incubator-pulsar that referenced this pull request Apr 13, 2022
### Motivation

apache#13023 has introduced a performance regression.
For each message, we are switching from external thread pool -> internal thread poll -> external thread pool.

Previously we want to control the outstanding messages of a consumer which using listener, so after apache#11455,
the message will not move from the receiver queue to the external executor. And apache#13023 changed the listener trigger
in the internal thread pool to fixes the orderding issue, so this is the root cause of the performance regression.

Here is the framegraph to to show the thread frame of internal thread and external thread.

### Modification

- Remove the isListenerHandlingMessage control
- Move the messages from receiver queue to the queue of external executor but not increase permits
- Increase permits before call message listener

After the above changes, we don't need to call triggerListener from the external executor.

Here is the thread framegraph after apply this change

Before this change, the consumer can't reach 50000 messages/s.
After this change, the consumer can reach
codelipenghui added a commit that referenced this pull request Apr 19, 2022
…15162)

### Motivation

#13023 has introduced a performance regression.
For each message, we are switching from external thread pool -> internal thread poll -> external thread pool.

Previously we want to control the outstanding messages of a consumer using a listener, so after #11455,
the message will not move from the receiver queue to the external executor. And #13023 changed the listener trigger
in the internal thread pool to fix the ordering issue, so this is the root cause of the performance regression.

Here is the frame graph to show the thread frame of the internal thread and external thread.
[framegraph.html.txt](https://github.com/apache/pulsar/files/8483765/framegraph.html.txt)

And also fix the performance issue for multiple topic consumers and key-shared subscriptions which enabled message listeners. Before this change, the messages are processed serially. After this change, We can improve parallelism on the premise of ensuring order.

### Modification

- Remove the isListenerHandlingMessage control
- Move the messages from the receiver queue to the queue of external executor but not increase permits
- Increase permits before call message listener
Nicklee007 pushed a commit to Nicklee007/pulsar that referenced this pull request Apr 20, 2022
…pache#15162)

### Motivation

apache#13023 has introduced a performance regression.
For each message, we are switching from external thread pool -> internal thread poll -> external thread pool.

Previously we want to control the outstanding messages of a consumer using a listener, so after apache#11455,
the message will not move from the receiver queue to the external executor. And apache#13023 changed the listener trigger
in the internal thread pool to fix the ordering issue, so this is the root cause of the performance regression.

Here is the frame graph to show the thread frame of the internal thread and external thread.
[framegraph.html.txt](https://github.com/apache/pulsar/files/8483765/framegraph.html.txt)

And also fix the performance issue for multiple topic consumers and key-shared subscriptions which enabled message listeners. Before this change, the messages are processed serially. After this change, We can improve parallelism on the premise of ensuring order.

### Modification

- Remove the isListenerHandlingMessage control
- Move the messages from the receiver queue to the queue of external executor but not increase permits
- Increase permits before call message listener
codelipenghui added a commit that referenced this pull request Apr 20, 2022
…15162)

#13023 has introduced a performance regression.
For each message, we are switching from external thread pool -> internal thread poll -> external thread pool.

Previously we want to control the outstanding messages of a consumer using a listener, so after #11455,
the message will not move from the receiver queue to the external executor. And #13023 changed the listener trigger
in the internal thread pool to fix the ordering issue, so this is the root cause of the performance regression.

Here is the frame graph to show the thread frame of the internal thread and external thread.
[framegraph.html.txt](https://github.com/apache/pulsar/files/8483765/framegraph.html.txt)

And also fix the performance issue for multiple topic consumers and key-shared subscriptions which enabled message listeners. Before this change, the messages are processed serially. After this change, We can improve parallelism on the premise of ensuring order.

- Remove the isListenerHandlingMessage control
- Move the messages from the receiver queue to the queue of external executor but not increase permits
- Increase permits before call message listener

(cherry picked from commit 83cd791)
codelipenghui added a commit that referenced this pull request Apr 20, 2022
…15162)

#13023 has introduced a performance regression.
For each message, we are switching from external thread pool -> internal thread poll -> external thread pool.

Previously we want to control the outstanding messages of a consumer using a listener, so after #11455,
the message will not move from the receiver queue to the external executor. And #13023 changed the listener trigger
in the internal thread pool to fix the ordering issue, so this is the root cause of the performance regression.

Here is the frame graph to show the thread frame of the internal thread and external thread.
[framegraph.html.txt](https://github.com/apache/pulsar/files/8483765/framegraph.html.txt)

And also fix the performance issue for multiple topic consumers and key-shared subscriptions which enabled message listeners. Before this change, the messages are processed serially. After this change, We can improve parallelism on the premise of ensuring order.

- Remove the isListenerHandlingMessage control
- Move the messages from the receiver queue to the queue of external executor but not increase permits
- Increase permits before call message listener

(cherry picked from commit 83cd791)
codelipenghui added a commit that referenced this pull request Apr 20, 2022
…15162)

#13023 has introduced a performance regression.
For each message, we are switching from external thread pool -> internal thread poll -> external thread pool.

Previously we want to control the outstanding messages of a consumer using a listener, so after #11455,
the message will not move from the receiver queue to the external executor. And #13023 changed the listener trigger
in the internal thread pool to fix the ordering issue, so this is the root cause of the performance regression.

Here is the frame graph to show the thread frame of the internal thread and external thread.
[framegraph.html.txt](https://github.com/apache/pulsar/files/8483765/framegraph.html.txt)

And also fix the performance issue for multiple topic consumers and key-shared subscriptions which enabled message listeners. Before this change, the messages are processed serially. After this change, We can improve parallelism on the premise of ensuring order.

- Remove the isListenerHandlingMessage control
- Move the messages from the receiver queue to the queue of external executor but not increase permits
- Increase permits before call message listener

(cherry picked from commit 83cd791)
nicoloboschi pushed a commit to datastax/pulsar that referenced this pull request Apr 20, 2022
…pache#15162)

apache#13023 has introduced a performance regression.
For each message, we are switching from external thread pool -> internal thread poll -> external thread pool.

Previously we want to control the outstanding messages of a consumer using a listener, so after apache#11455,
the message will not move from the receiver queue to the external executor. And apache#13023 changed the listener trigger
in the internal thread pool to fix the ordering issue, so this is the root cause of the performance regression.

Here is the frame graph to show the thread frame of the internal thread and external thread.
[framegraph.html.txt](https://github.com/apache/pulsar/files/8483765/framegraph.html.txt)

And also fix the performance issue for multiple topic consumers and key-shared subscriptions which enabled message listeners. Before this change, the messages are processed serially. After this change, We can improve parallelism on the premise of ensuring order.

- Remove the isListenerHandlingMessage control
- Move the messages from the receiver queue to the queue of external executor but not increase permits
- Increase permits before call message listener

(cherry picked from commit 83cd791)
(cherry picked from commit c712441)
nicoloboschi pushed a commit to datastax/pulsar that referenced this pull request Apr 20, 2022
…pache#15162)

apache#13023 has introduced a performance regression.
For each message, we are switching from external thread pool -> internal thread poll -> external thread pool.

Previously we want to control the outstanding messages of a consumer using a listener, so after apache#11455,
the message will not move from the receiver queue to the external executor. And apache#13023 changed the listener trigger
in the internal thread pool to fix the ordering issue, so this is the root cause of the performance regression.

Here is the frame graph to show the thread frame of the internal thread and external thread.
[framegraph.html.txt](https://github.com/apache/pulsar/files/8483765/framegraph.html.txt)

And also fix the performance issue for multiple topic consumers and key-shared subscriptions which enabled message listeners. Before this change, the messages are processed serially. After this change, We can improve parallelism on the premise of ensuring order.

- Remove the isListenerHandlingMessage control
- Move the messages from the receiver queue to the queue of external executor but not increase permits
- Increase permits before call message listener

(cherry picked from commit 83cd791)
(cherry picked from commit c712441)
@Technoboy- Technoboy- deleted the fix-11008 branch August 10, 2022 05:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/client cherry-picked/branch-2.7 Archived: 2.7 is end of life cherry-picked/branch-2.8 Archived: 2.8 is end of life doc-not-needed Your PR changes do not impact docs release/2.7.4 release/2.8.1 type/bug The PR fixed a bug or issue reported a bug
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Java client: consumer listener does not respect receiver queue size
8 participants