100 % Integrationszuverlässigkeit

In diesem Thema wird erläutert, warum Sie möglicherweise keine Verbindung zu Zencoder herstellen können und wie Sie eine zuverlässige Integration sicherstellen können.

Überblick

Zencoder ist für die meisten unserer Kunden eine wesentliche Software-Abhängigkeit. Und obwohl wir eine 100% ige Verfügbarkeit anstreben, kann es vorkommen, dass Sie keine Verbindung zu Zencoder herstellen können:

Wenn dies passiert und Zencoder nicht verfügbar ist, erhält Ihre Anwendung normalerweise die Antwort "503 Service nicht verfügbar" von Zencoder. Möglicherweise wird jedoch ein anderer Fehler angezeigt (z. B. 500). Wenn Sie Ihr API-Ratenlimit überschritten haben, erhalten Sie die Antwort "403-Ratenlimit überschritten".

Die gute Nachricht: Da die Videokodierung ein asynchroner Prozess ist, können Sie Ihre Anwendung so erstellen, dass keine Ausfallzeiten oder Probleme im Zusammenhang mit unserer Verfügbarkeit auftreten. Wenn Sie dies tun, ist das schlimmste Szenario, dass Ihre Jobs etwas länger dauern. Es treten jedoch keine Fehler auf. Wir empfehlen Ihnen dringend, dies zu tun.

Um es stärker auszudrücken, Wenn Sie Wert auf Zuverlässigkeit legen, sollten Sie diesen Integrationsansatz befolgen - für Zencoder oder für jede kritische API, in die Sie integrieren.

  • Unser Service kann durch Probleme bei einem Upstream-Anbieter (z. B. Amazon Web Services) beeinträchtigt werden.
  • Gelegentlich müssen wir Systemwartungen durchführen, die vorübergehende Ausfallzeiten erfordern
  • Sie haben Ihre übertroffen API-Ratenlimit
  • usw.

Zuverlässige App-Integration

  1. Fügen Sie ein Sekundäre URL als Backup für den Fall, dass der Upload an Ihren primären Speicherort fehlschlägt.
  2. Wenn Sie einen nicht erfolgreichen Antwortcode von Zencoder erhalten - im Grunde genommen etwas anderes als 200 oder 201 - scheitern Sie nicht den Job. Ein Antwortcode von 503 bedeutet nicht, dass Ihr Video nicht verarbeitet werden kann. Es bedeutet nur, dass Zencoder vorübergehend nicht verfügbar ist.
  3. Wenn Sie eine bekommen Verbindungsfehler Wenn Sie versuchen, eine Verbindung zu Zencoder herzustellen, gehen Sie genauso vor.
  4. Ähnlich, Schließen Sie Ihre API-Anforderungen in ein Timeout ein. Wir empfehlen eine Zeitüberschreitung von 30 Sekunden. Zencoder reagiert normalerweise in weniger als einer Sekunde, daher sind 30 Sekunden normalerweise ausreichend Zeit.
  5. In allen drei Fällen - wenn Sie einen nicht erfolgreichen Antwortcode erhalten, keine Verbindung herstellen können oder die API-Anforderung eine Zeitüberschreitung aufweist - Kennzeichnen Sie den Job als "ausstehend".
  6. Regelmäßig, Übergeben Sie alle Jobs im Status "Ausstehend" erneut. Sie können dies beispielsweise jede Minute mit cron tun.

Sobald die Jobs erneut gesendet wurden, verhält sich alles wie gewohnt. Auf diese Weise dauert eine fehlgeschlagene Auftragsübermittlung nur ein wenig länger, anstatt Probleme für Ihre Anwendung oder Ihre Benutzer zu verursachen.

Pseudocode

OK, das ist also kein Pseudocode - es ist Ruby. Aber Ruby ist ziemlich einfach zu lesen.

  1. Stellen Sie sich eine Videos-Tabelle vor, die diese Spalten enthält. (Es wird offensichtlich mehr enthalten, einschließlich Spalten zum Speichern einer Zencoder-Job-ID und einer Zencoder-Ausgabedatei-ID.)
    create_table :videos do |t|
    t.string  :state
    t.integer :lock_version
    t.index   :state
    end
  2. Ein Video sollte eine Zustandsmaschine mit den folgenden Zuständen enthalten:
    • ausstehend (noch nicht bei Zencoder eingereicht)
    • einreichen (derzeit an Zencoder einreichen)
    • Transcoding (erfolgreich an Zencoder eingereicht)
    • fertig (Zencoder hat die Transcodierung beendet und die Arbeit ist erledigt)
    • fehlgeschlagen (Zencoder konnte das Video nicht transkodieren)
  3. Wenn ein neues Video aufgenommen wird, speichern Sie das Video im Status "Senden" und lösen Sie einen Hintergrundjob aus, um das Video an Zencoder zu senden.
    # got a new video!
    video = Video.new(params)
    video.state = "submitting"
    video.save!
    submit_to_zencoder(video)

    Sie sollten die Methode submit_to_zencoder wirklich als Hintergrund verwenden. In Ruby mit DelayedJob könnte dies folgendermaßen aussehen:

    delay.submit_to_zencoder(video)

    Aber wir bleiben bei unserem submit_to_zencoder(video) Methode zum Beispiel Zwecke.

  4. Das submit_to_zencoder Funktion sieht ungefähr so aus. Dies sollte asynchron im Hintergrund ausgeführt werden.
    def submit_to_zencoder(video)
    begin
    response = Zencoder::Job.create(attributes, :timeout => 30_000)
    if response.code == 201
    video.state = "transcoding"
    else
    video.state = "pending"
    end
    
    video.save!
    
    # Rescue any connection error. Our plugin abstracts these as
    # Zencoder::HTTPError.
    #
    # If you're not using the Zencoder plugin, this includes things
    # like Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::ECONNREFUSED,
    # Errno::EHOSTDOWN, and SocketError.
    
    rescue Timeout::Error, Zencoder::HTTPError
    video.state = "pending"
    video.save!
    end
    end
  5. Versuchen Sie von Zeit zu Zeit - z. B. jede Minute - erneut, Aufträge zu übermitteln, die sich im Status "Ausstehend" befinden.
    def resubmit_pending_jobs
    Video.where(:state => "pending").find_each do |video|
    begin
    video.state = "submitting"
    video.save!
    
    submit_to_zencoder(video)
    rescue ActiveRecord::StaleObjectError
    end
    end
    end
    

    Durch Hinzufügen einer Spalte 'lock_version' zur Videotabelle führen wir außerdem ein optimistisches Sperren ein. Dies bedeutet, dass, wenn der Datensatz zwischen dem aktualisiert wird Video.find Abfrage und video.save Der Auftrag wird nicht an Zencoder gesendet. Dadurch wird verhindert, dass der Auftrag zweimal versehentlich an Zencoder gesendet wird. Sie können pessimistische Sperren oder Datenbanksperren oder eine andere Sperrmethode verwenden, um dasselbe zu erreichen.

    So einfach ist das…

    Alles in allem ist dies ein ziemlich einfacher Ansatz, um eine 100% ige Integrationszuverlässigkeit zwischen Zencoder und Ihrer Anwendung sicherzustellen. Es sind ein paar Schritte mehr als nur das naive Einreichen eines Jobs. Es stellt jedoch sicher, dass Ihre App zuverlässig ausgeführt wird, unabhängig davon, was passiert - ob es sich um eine gelegentliche Zeitüberschreitung, unerwartete Ausfallzeiten bei Zencoder oder geplante Wartungsarbeiten handelt.