feat: remove stale ONLINE_PRESENCE contact keys in redis (#9558)

50% of Redis memory size comes from ONLINE_PRESENCE keys. This PR adds a
periodic job to remove stale keys from all accounts.
This commit is contained in:
Vishnu Narayanan
2024-12-02 15:47:54 +05:30
committed by GitHub
parent 1c12fbceb9
commit e95680e800
4 changed files with 42 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
# housekeeping
# remove contact inboxes that does not have any conversations
# and are older than 3 months
class Internal::ProcessStaleRedisKeysJob < ApplicationJob
queue_as :low
def perform(account)
Internal::RemoveStaleRedisKeysService.new(account_id: account.id).perform
end
end

View File

@@ -0,0 +1,14 @@
# housekeeping
# ensure stale ONLINE PRESENCE KEYS for contacts are removed periodically
# should result in 50% redis mem size reduction
class Internal::RemoveStaleRedisKeysJob < ApplicationJob
queue_as :scheduled_jobs
def perform
Account.find_each do |account|
Rails.logger.info "Enqueuing ProcessStaleRedisKeysJob for account #{account.id}"
Internal::ProcessStaleRedisKeysJob.perform_later(account)
end
end
end

View File

@@ -0,0 +1,10 @@
class Internal::RemoveStaleRedisKeysService
pattr_initialize [:account_id!]
def perform(account_id)
range_start = (Time.zone.now - PRESENCE_DURATION).to_i
# exclusive minimum score is specified by prefixing (
# we are clearing old records because this could clogg up the sorted set
::Redis::Alfred.zremrangebyscore(presence_key(account_id, 'Contact'), '-inf', "(#{range_start}")
end
end

View File

@@ -26,3 +26,10 @@ remove_stale_contact_inboxes_job.rb:
cron: '30 22 * * *'
class: 'Internal::RemoveStaleContactInboxesJob'
queue: scheduled_jobs
# executed daily at 2230 UTC
# which is our lowest traffic time
remove_stale_redis_keys_job.rb:
cron: '30 22 * * *'
class: 'Internal::RemoveStaleRedisKeysJob'
queue: scheduled_jobs