Подождите, пока значение не появится в хэше

Недавно мне было поручено создать запрос 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

Другие вопросы по тегам