PERF: Move user-tips and narrative to per-user messagebus channels (#19773)

Using a shared channel with per-message permissions means that every client is updated with the channel's 'last_id', even if there are no messages available to them. Per-user channel names avoid this problem - the last_id will only be incremented when there is a message for the given user.
This commit is contained in:
David Taylor 2023-01-30 11:48:09 +00:00 committed by GitHub
parent 939c2a7371
commit 79bea9464c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 31 additions and 13 deletions

View File

@ -13,11 +13,19 @@ export default {
this.messageBus = container.lookup("service:message-bus");
this.site = container.lookup("service:site");
this.messageBus.subscribe("/user-tips", this.onMessage);
this.messageBus.subscribe(
`/user-tips/${this.currentUser.id}`,
this.onMessage
);
},
teardown() {
this.messageBus?.unsubscribe("/user-tips", this.onMessage);
if (this.currentUser) {
this.messageBus?.unsubscribe(
`/user-tips/${this.currentUser.id}`,
this.onMessage
);
}
},
@bind

View File

@ -251,7 +251,11 @@ class UserUpdater
end
end
if attributes.key?(:seen_popups) || attributes.key?(:skip_new_user_tips)
MessageBus.publish("/user-tips", user.user_option.seen_popups, user_ids: [user.id])
MessageBus.publish(
"/user-tips/#{user.id}",
user.user_option.seen_popups,
user_ids: [user.id],
)
end
DiscourseEvent.trigger(:user_updated, user)
end

View File

@ -15,9 +15,9 @@ export default {
this.appEvents = container.lookup("service:app-events");
withPluginApi("0.8.7", (api) => {
const currentUser = api.getCurrentUser();
this.currentUser = api.getCurrentUser();
if (!currentUser) {
if (!this.currentUser) {
return;
}
@ -41,17 +41,19 @@ export default {
);
this.messageBus.subscribe(
"/new_user_narrative/tutorial_search",
`/new_user_narrative/tutorial_search/${this.currentUser.id}`,
this.onMessage
);
});
},
teardown() {
this.messageBus?.unsubscribe(
"/new_user_narrative/tutorial_search",
this.onMessage
);
if (this.currentUser) {
this.messageBus?.unsubscribe(
`/new_user_narrative/tutorial_search/${this.currentUser.id}`,
this.onMessage
);
}
},
@bind

View File

@ -173,7 +173,11 @@ module DiscourseNarrativeBot
topic = @post.topic
post = topic.first_post
MessageBus.publish("/new_user_narrative/tutorial_search", {}, user_ids: [@user.id])
MessageBus.publish(
"/new_user_narrative/tutorial_search/#{@user.id}",
{},
user_ids: [@user.id],
)
raw = <<~MD
#{post.raw}

View File

@ -551,7 +551,7 @@ RSpec.describe UserUpdater do
context "when skip_new_user_tips is edited" do
it "updates seen_popups too" do
messages =
MessageBus.track_publish("/user-tips") do
MessageBus.track_publish("/user-tips/#{user.id}") do
UserUpdater.new(Discourse.system_user, user).update(skip_new_user_tips: true)
end
@ -573,7 +573,7 @@ RSpec.describe UserUpdater do
context "when seen_popups is edited" do
it "publishes a message" do
messages =
MessageBus.track_publish("/user-tips") do
MessageBus.track_publish("/user-tips/#{user.id}") do
UserUpdater.new(Discourse.system_user, user).update(seen_popups: [1])
end