Подождите, пока значение не появится в хэше
Недавно мне было поручено создать запрос REST API, который отвечает за отправку сообщений во входящий канал Kafka, а затем ожидает вывода из исходящего. Все шло хорошо, пока я не столкнулся с проблемой, связанной с ожиданием этого конкретного сообщения.
Стоит отметить, что после успешного прибытия сообщения записываются в глобальные держатели сообщений, которые представляют собой просто рубиновый хеш под капотом. Ниже приведена функция, которая отслеживает хэш, пока последний не заполнится каким-либо значением.
def monitor_payment_hash(key)
while @uuid.payment_create.get_message(key).nil?
next
end
@uuid.payment_create.get_message(key)
end
Уместно ли вообще реализовать это таким образом? Что я должен предпринять в этот момент?
ВНИМАНИЕ. Потребитель Kafka работает в отдельном потоке.
Обновлять
Я только что зашел в ruby docs и наткнулся на несколько интересных разделов на каналах. Насколько мне известно, каналы - лучший выбор для связи между рубинитами (просто причудливое название для горутин, но в экосистеме рубинов :))1 ответ
Я думаю тебе нужно
timeout
и способ принудительно остановить процесс опроса, кроме того, вам может понадобиться аннотация для улучшения в будущем.
class Poller
def self.poll(key:, from_source:, options: {})
start_time = Time.now
catch(:stop_polling) do
loop do
message = from_source.get_message(key)
if message.nil?
wait_time = Time.now - start_time
throw :stop_polling if wait_time > options[:timeout]
else
yield(message) if block_given?
throw :stop_polling
end
end
end
end
end
def monitor_payment_hash(key)
Poller.poll key: key, from_source: @uuid.payment_create, options: {timeout: 60} do |message|
# write to the global message holders
# or handle message by block
yield(message) if block_given?
end
end
Возможно, вам потребуется добавить дополнительную логику, такую как повторная попытка, если тайм-аут, опрос списка ключей, журнал ... Я рекомендую вам узнать, как построить длинный опрос из этого источника: https://github.com/aws/aws-sdk-ruby / blob / version-3 / gems / aws-sdk-sqs / lib / aws-sdk-sqs / queue_poller.rb