Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Rails에서 일회성 스크립트 작성

CSV 파일에서 많은 데이터를 앱으로 가져오고 싶었던 적이 있습니까? 또는 일부 고객 리뷰에서 잘못 인코딩된 문자를 수정해야 할 수도 있습니다. 또는 Redis에 데이터를 저장하는 방법에 대해 마음이 바뀌었고 모든 것을 이전 형식에서 새 형식으로 옮겨야 했습니다.

Avvo에서는 이러한 작업을 "임시 작업"이라고 불렀습니다. 에서와 같이 한 번만 실행하면 됩니다. 그래서 Rails에서 임시 작업을 처리하는 가장 좋은 방법은 무엇입니까?

데이터베이스 마이그레이션 작성

데이터베이스의 데이터 구조를 변경해야 하는 경우 마이그레이션이 잘 작동합니다. 작업이 실행되었는지 여부를 추적하고 변경 사항을 다른 환경으로 전달합니다. 바로 마이그레이션이 구축된 것입니다. 을 위한. 또한 이미 사용 중일 수도 있습니다.

데이터를 동시에 변경하는 경우 마이그레이션이 할 수 있습니다. 잘 작동합니다. 하지만 주의해야 할 사항이 있습니다.

Permissions.create(...)와 같은 호출 마이그레이션에서 문제가 발생할 수 있습니다. 모델이 변경된 경우 마이그레이션이 실행될 때 모델을 사용하지 못할 수 있으므로 마이그레이션이 중단될 수 있습니다. 또는 마이그레이션을 작성한 시간과 실행한 시간 사이에 모델이 변경되었을 수 있습니다. 이 문제를 해결할 수 있는 방법이 있지만 오류가 발생하기 쉽고 이상한 방식으로 실패할 수 있습니다.

작업에 ActiveRecord가 포함되지 않은 경우 마이그레이션도 덜 유용합니다.

이들은 거래 차단기가 아닙니다. 하지만 저는 마이그레이션에서 많은 데이터를 가져오거나 변경하지 않는 경향이 있습니다. 더 나은 옵션이 있습니다.

갈퀴 작업 작성

과제가 있습니다. 아마도 한 번만 실행하고 싶을 것입니다. 그리고 컴퓨터에서 테스트하고 프로덕션 환경에서 실행할 수 있기를 원합니다.

Rake 작업은 이를 위해 매우 효과적입니다. Rails는 레이크 작업을 생성할 수도 있습니다.

$ be rails g task locations import
      create  lib/tasks/locations.rake

이렇게 하면 다음 위치에 코드를 숨길 수 있는 파일이 생성됩니다.

lib/tasks/locations.rake
namespace :locations do
  desc "TODO"
  task import: :environment do

  end
end

해당 task 내부 블록을 사용하면 Rails 앱에서 모든 모델과 나머지 코드를 사용할 수 있습니다. Rails 콘솔에 앉아 있는 것처럼 코드를 작성할 수 있으므로 데이터를 가져오고 변경하기 쉽습니다.

작업을 작성한 후에는 rake locations:import를 사용하여 실행할 수 있습니다. . Heroku를 사용하는 경우 heroku run rake locations:import로 실행할 수 있습니다. . Capistrano를 사용하는 경우 capistrano-rake gem을 사용하여 작업을 실행할 수 있습니다. 하지만 더 나은 옵션이 있을 수 있습니다.

sidekiq-scheduler를 사용하여 예약된 작업 작성

앱이 충분히 크면 아마도 이미 Sidekiq, Resque 등을 사용하고 있습니다.

이러한 백그라운드 작업 프로세서의 대부분은 나중에 실행되도록 작업을 예약할 수 있습니다. 예를 들어 Sidekiq에는 sidekiq-scheduler gem이 있습니다. 그리고 sidekiq-scheduler를 사용하면 할 수 있는 트릭이 있습니다.

한번도 자동으로 되지 않는 직업이 있다면 어떨까요? 자체적으로 예약되지만 수동으로 원하는 시간에 예약하시겠습니까? 나중에 다시 실행하거나 UI를 사용하여 실행하려는 "일회성" 작업에 적합합니다.

sidekiq-scheduler에서 작업을 훨씬 더 먼 미래로 예약하고 작업을 비활성화로 설정할 수 있습니다.

sidekiq.yml
:schedule:
  location_importer:
    class: LocationImporterWorker
    at: '3001/01/01'
    enabled: false

그런 다음 sidekiq-web을 방문하면 작업을 수동으로 대기열에 넣는 버튼이 표시됩니다.

Rails에서 일회성 스크립트 작성

이를 통해 개발 및 프로덕션 모두에서 준비가 될 때마다 작업을 실행할 수 있습니다. 그리고 다시 실행해야 하는 경우 UI에 바로 있습니다.

직업이 위험한 경우에는 이것이 최선의 선택이 아닙니다. 실수로 그 버튼을 클릭하는 것은 너무 쉽습니다. 작업을 완료하는 데 시간이 오래 걸리는 것도 좋지 않습니다. Sidekiq은 작업이 빨리 완료될 때 가장 잘 작동하기 때문입니다. 작업이 작업자를 대신하게 되며 작업이 완료될 때까지 Sidekiq을 안전하게 다시 시작할 수 없습니다. 하지만 작업이 빠르고 두 번 이상 안전하게 실행할 수 있다면 잘 작동합니다. 정리 작업이라면 원하는 정기적으로 실행합니다.

스케줄링과 트리거링에만 집중하고 싶거나 일회성 스크립트에서 매개변수를 설정하는 데 더 많은 유연성이 필요한 경우 독자인 Dmitry가 저에게 sidekiq-enqueuer를 지적했습니다. sidekiq-enqueuer를 사용하면 Sidekiq 웹 인터페이스를 통해 작업을 예약하고 매개변수를 설정할 수 있습니다.

SSH를 프로덕션에 연결하고 코드를 Rails 콘솔에 붙여넣기

농담이에요.

어느 것을 선택해야 합니까?

이 모든 방법을 사용하여 일회성 작업을 실행했습니다. 하지만 나는 보통 먼저 갈퀴 작업을 하러 갑니다. 작동하고 실수로 실행하기 어렵고 작업이 끝나면 쉽게 제거할 수 있습니다. 하지만 매번 갈퀴 작업을 선택하지는 않습니다.

다음과 같은 경우 이전을 선택할 수 있습니다.

  • 데이터베이스 스키마 변경의 일부로 SQL을 사용하여 데이터를 수정하는 작업입니다.
  • 열의 데이터를 변경하거나 몇 개의 레코드를 추가하는 것과 같은 매우 간단한 데이터 작업입니다.
  • 작업이 실행되었는지 여부를 쉽게 추적하고 다시 실행하지 않고 싶습니다.

다음과 같은 경우 Sidekiq 작업을 선택할 수 있습니다.

  • 나중에 작업을 다시 실행하고 싶은 생각이 듭니다.
  • 내가 아닌 다른 사람이 실행해야 합니다. 버튼을 클릭하기만 하면 됩니다.
  • 짧은 데이터 가져오기 또는 데이터 정리 작업입니다. 처음에는 예상하지 못하더라도 정기적으로 실행해야 할 것입니다.

당신은 어떤가요? 다른 옵션이 있습니까, 아니면 다른 선택을 하시겠습니까? 댓글을 남겨 알려주세요!