#ruby-on-rails #asynchronous #activerecord #sidekiq
#ruby-on-rails #асинхронный #activerecord #sidekiq
Вопрос:
У меня есть рабочий sidekiq, который ожидает изменения записи, сделанной удаленным клиентом. Что-то вроде следующего:
#myworker async process to wait for client to confirm status
perform(myRecordID)
sendClient(myRecordID)
didClientAcknowledge = false
while !didClientAcknowledge
didClientAcknowledge = myRecords.find(myRecordID).status == :ACK_OK
if didClientAcknowledge
break
end
# wait for client to perform an update on the record to confirm status
sleep 5.seconds
end
Rails.logger.info("client got the message")
end
моя проблема в том, что, хотя я вижу, что клиент фактически выполнил подтверждение и обновил запись с правильным обновлением статуса (ACK_OK), мой поток sidekiq продолжает видеть старый статус для MyRecord.
Я уверен, что моя логика здесь ошибочна, но похоже, что процесс sidekiq не «видит» изменения в БД … но если я использовал свою консоль rails, я вижу, что клиент фактически обновил БД, как и ожидалось…
Спасибо!
Редактировать 1
хорошо, вот мысль, вместо цикла я запланирую еще один вызов рабочему в течение 5 секунд … итак, вот обновленный код:
perform(myRecordID, retry_count)
retry_count -= 1
if retry_count < 1
return
end
sendClient(myRecordID)
didClientAcknowledge = false
if !didClientAcknowledge
didClientAcknowledge = myRecords.find(myRecordID).status == :ACK_OK
if didClientAcknowledge
Rails.logger.info("client got the message")
return
end
# wait for client to perform an update on the record to confirm status
myWorker.perform_in(5.seconds)
end
Rails.logger.info("client got the message")
end
Кажется, это работает, но будет тестироваться немного дольше .. одна из проблем заключается в подсчете повторных попыток, что означает, что мне нужно поддерживать какую-то переменную между вызовами worker…
edit2 возможно, это можно сделать, передав время первому вызову, а затем проверив, превышен ли тайм-аут перед вызовом следующего экземпляра … предполагая, что время не стоит на месте и внутри асинхронного вызова…
edit3 Добавление аргумента retry_count позволяет нам контролировать, сколько раз этот рабочий будет порожден…
Комментарии:
1. вместо того, чтобы переходить в режим ожидания или повторять рабочий процесс, почему бы вам не ввести в действие «подтверждение» вызов того, что вы хотите сделать?
2. Клиенты подключены к сетям 4G, и иногда они не подтверждают… повторная попытка в основном выполняет повторную отправку (через actioncable, которая кажется с потерями, если, возможно, я не злоупотребляю actioncable… что не было бы первым XD)…