Есть ли способ обойти тайм-ауты H12 в Heroku, используя griddler для анализа входящих сообщений с большими вложениями из sendgrid - PullRequest
0 голосов
/ 17 июня 2019

Мой рабочий процесс - электронная почта - sendgrid - griddler, а приложение rails запускается на heroku.Все входящие электронные письма имеют вложения, а некоторые довольно большие.Я продолжаю получать тайм-ауты H12 на Heroku, потому что вложения загружаются в Google Cloud Storage более 30 секунд.

Я использовал отложенное задание для всего, что могу, но я НЕ ДУМАЮ, что могу передать вложение из griddler в отложенное задание, поскольку вложение является эфемерным.У меня был друг, предложивший просто перейти к получению электронных писем из gmail вместо использования sendgrid и griddler, но это было бы больше переписать, чем сейчас.В идеальном мире я мог бы передать вложения на отложенную работу, но я не знаю, возможно ли это в конце концов.

    email_processor.rb

        if pdfs = attachments.select { |attachment| attachment.content_type == 'application/pdf' }
          pdfs.each do |att|
            # att is a ActionDispatch::Http::UploadedFile type
            # content_type = MIME::Types.type_for(att.to_path).first.content_type
            content_type = att.content_type
            if content_type == 'application/pdf'
              # later if we use multiple attachments in single fax, change num_pages
              fax = @email_address.phone_number.faxes.create(sending_email: @email_address.address ,twilio_to: result, twilio_from: @email_address.phone_number.number, twilio_num_pages: 1)
              attachment = fax.create_attachment
              # next two rows should be with delay
              attachment.upload_file!(att)
              #moved to attachment model for testing
              #fax.send!
            end
          end


    file upload from another model
    def upload_file!(file)
    # file should be ActionDispatch::Http::UploadedFile type
    filename = file.original_filename.gsub(/\s+/, '_')
    filename = filename[0..15] if filename.size > 16
    path = "fax/#{fax.id}/att-#{id}-#{filename}"
    upload_out!(file.open, path)

    #self.fax.send!
    #make_thumbnail_pdf!(file.open)
  end

  def upload_out!(file, path)
    upload = StorageBucket.files.new key: path, body: file, public: true
    upload.save # upload file
    update_columns url: upload.public_url
    self.fax.update(status: 'outbound-uploaded')
    self.fax.process!
  end

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

В итоге я полностью переписал обработку электронной почты. Я настроил gmail в качестве цели для почты, а затем использовал запланированное задание в Heroku для обработки писем (ищите непрочитанные) и затем загружал вложения в Google Cloud Storage. Использование запланированного задания позволяет обойти проблемы H12.

0 голосов
/ 19 июня 2019

Если вы не можете получить и загрузить вложение в течение 30 секунд, то heroku не будет работать для получения электронных писем. Вы правы - временное хранилище в веб-журнале недоступно из рабочего журнала, запускающего отложенное задание.

Даже если бы рабочий dyno мог читать данные из эфемерного хранилища web-dyno, нет гарантии, что web-dyno сможет обработать POST из sendgrid за 30 секунд, если вложения будут достаточно большими.

Один из вариантов - настроить sendgrid для пересылки электронных писем непосредственно в ваш движок приложений Google - https://cloud.google.com/appengine/docs/standard/python/mail/receiving-mail-with-mail-api

Ваш скрипт обработчика приложений может записывать вложения в облачное хранилище Google, а затем сценарий обработчика приложений может выполнять процедуру POST для приложения heroku с указанием местоположения вложения, а веб-приложение может ставить отложенную работу для загрузки и обработки. вложение.

...