0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-09 21:45:25 +08:00
discourse/app/jobs/scheduled/flush_browser_pageview_events.rb
Krzysztof Kotlarek fe862e0931
PERF: Batch BrowserPageviewEvent inserts through Redis (#40328)
Persisted browser pageview events now enqueue lightweight payloads in
Redis and flush them in batches through a scheduled job, reducing
per-request database writes.

The flush path preserves queued events while PostgreSQL is readonly, and
request tracking skips browser pageview logging during PostgreSQL
readonly mode.
2026-06-22 10:19:01 +08:00

24 lines
669 B
Ruby
Vendored

# frozen_string_literal: true
module Jobs
class FlushBrowserPageviewEvents < ::Jobs::Scheduled
every 5.minutes
MAX_FLUSH_SECONDS = 50
def execute(args)
return if !SiteSetting.persist_browser_pageview_events
return if Discourse.pg_readonly_mode?
deadline = Process.clock_gettime(Process::CLOCK_MONOTONIC) + MAX_FLUSH_SECONDS
loop do
return if BrowserPageviewEvent.queued_count == 0
processed = BrowserPageviewEvent.flush_queued!
return if processed < BrowserPageviewEvent::REDIS_FLUSH_BATCH_SIZE
return if Process.clock_gettime(Process::CLOCK_MONOTONIC) >= deadline
end
end
end
end