mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 16:34:31 +08:00
PERF: message_bus will be deferred by server when flooded
The message_bus performs a fair amount of work prior to hijacking requests this change ensures that if there is a situation where the server is flooded message_bus will inform client to back off for 30 seconds + random(120 secs) This back-off is ultra cheap and happens very early in the middleware. It corrects a situation where a flood to message bus could cause the app to become unresponsive MessageBus update is here to ensure message_bus gem properly respects Retry-After header and status 429. Under normal state this code should never trigger, to disable raise the value of DISCOURSE_REJECT_MESSAGE_BUS_QUEUE_SECONDS, default is to tell message bus to go away if we are queueing for 100ms or longer
This commit is contained in:
@ -14,6 +14,31 @@ describe 'rate limiter integration' do
|
||||
RateLimiter.disable
|
||||
end
|
||||
|
||||
it "will rate limit message bus requests once queueing" do
|
||||
freeze_time
|
||||
|
||||
global_setting :reject_message_bus_queue_seconds, 0.1
|
||||
|
||||
post "/message-bus/#{SecureRandom.hex}/poll", headers: {
|
||||
"HTTP_X_REQUEST_START" => "t=#{Time.now.to_f - 0.2}"
|
||||
}
|
||||
|
||||
expect(response.status).to eq(429)
|
||||
expect(response.headers['Retry-After']).to be > 29
|
||||
end
|
||||
|
||||
it "will not rate limit when all is good" do
|
||||
freeze_time
|
||||
|
||||
global_setting :reject_message_bus_queue_seconds, 0.1
|
||||
|
||||
post "/message-bus/#{SecureRandom.hex}/poll", headers: {
|
||||
"HTTP_X_REQUEST_START" => "t=#{Time.now.to_f - 0.05}"
|
||||
}
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
end
|
||||
|
||||
it "will clear the token cookie if invalid" do
|
||||
name = Auth::DefaultCurrentUserProvider::TOKEN_COOKIE
|
||||
|
||||
|
Reference in New Issue
Block a user