100% 통합 신뢰성

이 항목에서는 Zencoder에 연결할 수 없는 이유와 안정적인 통합을 보장하는 방법에 대해 설명합니다.

개요

Zencoder는 대부분의 고객에게 필수적인 소프트웨어 종속성입니다. 그리고 100 % 가동 시간을 목표로하지만 Zencoder에 연결할 수없는 경우가있을 수 있습니다.

이런 일이 발생하고 Zencoder가 다운되면 애플리케이션은 일반적으로 Zencoder에서 '503 Service Unavailable'응답을 받지만 다른 오류 (예 : 500)가 발생할 수 있습니다. API 속도 제한을 초과 한 경우 '403 Rate Limit Exceeded'응답을 받게됩니다.

좋은 소식 : 비디오 인코딩은 비동기식 프로세스이므로 다운 타임이나 가용성과 관련된 문제가 발생하지 않도록 애플리케이션을 구축 할 수 있습니다. 이렇게하면 최악의 시나리오는 작업이 조금 더 오래 걸리는 것입니다. 그러나 오류는 발생하지 않습니다. 이렇게하는 것이 좋습니다.

더 강하게 말하면안정성에 관심이 있다면 통합에 대한이 접근 방식을 따라야합니다. -Zencoder 또는 통합하는 중요한 API 용.

  • 당사 서비스는 업스트림 공급자 (예 : Amazon Web Services)의 문제로 인해 영향을받을 수 있습니다.
  • 때때로 일시적인 다운 타임이 필요한 시스템 유지 관리를 수행해야합니다.
  • 당신은 당신의 API 비율 제한
  • 기타

안정적인 앱 통합

  1. 포함보조 URL기본 위치로의 업로드가 실패하는 경우 백업으로.
  2. Zencoder에서 실패한 응답 코드를받은 경우-기본적으로 200 또는 201이 아닌 다른 코드- 일을 실패하지 마십시오 . 응답 코드 503은 동영상을 처리 할 수 없음을 의미하지 않습니다. Zencoder를 일시적으로 사용할 수 없음을 의미합니다.
  3. 당신이 얻는 경우연결 오류 Zencoder에 연결하려고 할 때 동일한 작업을 수행하십시오.
  4. 비슷하게, 시간 제한에 API 요청을 래핑 . 30 초 제한 시간을 권장합니다. Zencoder는 일반적으로 1 초 이내에 응답하므로 일반적으로 30 초이면 충분합니다.
  5. 이 세 가지 경우 모두-성공하지 못한 응답 코드를 받거나 연결할 수 없거나 API 요청 시간이 초과 된 경우- 작업을 '보류 중'으로 표시하십시오.
  6. 주기적으로 '보류 중'상태의 작업을 다시 제출하십시오. . 예를 들어 cron을 사용하여 매분마다이 작업을 수행 할 수 있습니다.

작업이 다시 제출되면 모든 것이 정상적으로 작동합니다. 이렇게하면 작업 제출이 실패하면 응용 프로그램이나 사용자에게 문제를 일으키지 않고 작업 시간이 조금 더 걸립니다.

의사 코드

좋습니다. 이것은 의사 코드가 아닙니다. Ruby입니다. 그러나 Ruby는 읽기가 매우 쉽습니다.

  1. 이러한 열이 포함 된 비디오 테이블을 상상해보십시오. (Zencoder 작업 ID 및 Zencoder 출력 파일 ID를 저장하는 열을 포함하여 분명히 더 많은 것이 있습니다.)
    create_table :videos do |t|
    t.string  :state
    t.integer :lock_version
    t.index   :state
    end
  2. 비디오에는 다음 상태의 상태 시스템이 포함되어야합니다.
    • 보류 중 (아직 Zencoder에 제출되지 않음)
    • 제출 중 (현재 Zencoder에 제출 중)
    • 트랜스 코딩 (Zencoder에 성공적으로 제출 됨)
    • 완료 됨 (Zencoder가 트랜스 코딩을 완료하고 작업이 완료 됨)
    • 실패 (Zencoder가 비디오를 트랜스 코딩 할 수 없음)
  3. 새 비디오가 수집되면 비디오를 '제출 중'상태로 저장하고 백그라운드 작업을 트리거하여 비디오를 Zencoder에 제출합니다.
    # got a new video!
    video = Video.new(params)
    video.state = "submitting"
    video.save!
    submit_to_zencoder(video)

    정말로 submit_to_zencoder 메소드를 배경으로해야합니다. Ruby에서 DelayedJob을 사용하면 다음과 같이 보일 수 있습니다.

    delay.submit_to_zencoder(video)

    그러나 우리는 우리의submit_to_zencoder(video)예를 들어 방법.

  4. 그만큼submit_to_zencoder함수는 다음과 같습니다. 이것은 백그라운드에서 비동기 적으로 실행되어야합니다.
    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. 매분마다 (예 : 매분) '보류 중'상태에있는 작업을 다시 제출하십시오.
    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
    

    또한 videos 테이블에 'lock_version'열을 추가하여 낙관적 잠금을 도입합니다. 즉, 레코드가Video.find쿼리 및video.save , Zencoder에 작업을 제출하지 않습니다. 이렇게하면 작업이 실수로 Zencoder에 두 번 제출되는 것을 방지 할 수 있습니다. 비관적 또는 데이터베이스 잠금 또는 다른 잠금 방법을 사용하여 동일한 작업을 수행 할 수 있습니다.

    아주 쉽습니다 ...

    모든 것을 고려할 때 이것은 Zencoder와 애플리케이션 간의 100 % 통합 안정성을 보장하는 매우 간단한 접근 방식입니다. 순진하게 작업을 제출하는 것보다 몇 단계가 더 필요합니다. 그러나 간헐적 인 시간 초과, Zencoder의 예상치 못한 다운 타임 또는 예정된 유지 관리 등 어떤 일이 발생하더라도 앱이 안정적으로 실행되도록합니다.