2016-03-15 28 views
6

Tôi hiện đang trong quá trình di chuyển một trang web Django từ máy chủ lưu trữ của riêng tôi chạy Ubuntu sang AWS Elastic Beanstalk.Thiết lập công việc đã lên lịch/cron với Django trên Cây đậu đàn hồi với một Worker Tier

Tôi đã tìm thấy quy trình hơi thẳng về phía trước cho đến nay - cho đến khi cố gắng thiết lập một vài công việc đã lên lịch cho ứng dụng của tôi. Từ những gì tôi có thể thu thập, tôi muốn chạy một công việc định kỳ trên môi trường tầng công nhân bằng cách sử dụng tệp cron.yaml. Tôi đã đọc qua các tài liệu: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html#worker-periodictasks

Và đọc các bài viết trên blog: https://medium.com/@joelennon/running-cron-jobs-on-amazon-web-services-aws-elastic-beanstalk-a41d91d1c571#.mx7dq9ufo

Và nhiều bài viết StackOverflow, nhưng tôi cảm thấy như tôi vẫn đang thiếu một số khái niệm cơ bản về những gì thực sự tạo nên nhân viên của tôi tầng môi trường. Trên máy chủ của riêng tôi, tôi có thể chỉ cần thiết lập một công việc cron để phù hợp với nhu cầu này - vì vậy khái niệm này khá mới mẻ đối với tôi. Tôi cũng có một vài ứng dụng Django chạy trên Heroku sử dụng dynos web và công nhân, xử lý không đồng bộ, Redis và Celery và các công việc theo lịch trình, nhưng tôi không thể tìm ra cách dịch thuật này thành thế giới Đàn hồi đậu.

Về cơ bản, các khái niệm tôi muốn hiểu là:

  1. Điều gì thực sự tạo nên môi trường cấp công nhân của tôi như xa như mã đi? Rõ ràng không chỉ là tệp cron.yaml. Đây có phải là bản sao chính xác của ứng dụng web của tôi, được triển khai cho môi trường này không? Hoặc có thể bằng cách nào đó tham khảo mã từ môi trường web của tôi và chạy theo cách đó?
  2. Hoặc ứng dụng hoàn toàn mới hoàn toàn là ứng dụng hoàn toàn mới? Tôi có cần phải tạo một ứng dụng Django/Flask hoàn toàn riêng biệt để thực hiện việc này không?
  3. Ứng dụng công nhân của tôi nói chuyện như thế nào với ứng dụng web của tôi? Làm thế nào là các tin nhắn POST trong cron.yaml thực sự có nghĩa là để thực hiện các công việc trên ứng dụng web? Nếu đó là một ứng dụng độc lập, thì nhân viên và môi trường web thực sự được liên kết như thế nào?

Tôi về cơ bản muốn lên lịch một số lệnh quản lý Django. Tôi cũng đã tiếp cận các phương thức như các điểm cuối POST nhưng không thể tìm ra cách để môi trường nhân viên nói chuyện/thực thi các công việc trên ứng dụng web.

Xin lỗi ngây thơ của tôi, tôi thực sự sẽ đánh giá cao bất kỳ loại lời khuyên và hướng nào về cách khái niệm này kết hợp với nhau.

Trả lời

3

Vì vậy, tôi đã kết thúc nói chuyện với một người bạn quen thuộc hơn với các dịch vụ AWS. Ông giải thích các khái niệm, và tôi nhận được các công việc theo lịch trình chạy bằng cách thiết lập môi trường công nhân như sau:

  • Xây dựng một ứng dụng độc lập riêng biệt với môi trường web. Tôi đã tạo ứng dụng Django "công nhân" riêng biệt, nhưng có thể là Flask hoặc bất kỳ khung công tác hoặc ngôn ngữ nào khác
  • Tạo một ứng dụng gọi là "cron" có chế độ xem để xử lý các thông báo POST đến các điểm cuối khác nhau. muốn thực hiện. Những điểm cuối là những công việc trong tập tin cron.yaml của tôi trực tiếp tới
  • Vì công việc của tôi cần thay đổi cơ sở dữ liệu cho ứng dụng web, tôi thiết lập ứng dụng công nhân để sử dụng cùng cơ sở dữ liệu với ứng dụng web. Điều này đơn giản như việc thêm các biến môi trường RDS vào cấu hình môi trường công nhân của tôi. Ví dụ. Đặt RDS_DB_NAME, RDS_HOSTNAME, RDS_USERNAME để trỏ đến cơ sở dữ liệu môi trường web

Et thì, các công việc đã lên lịch thực hiện theo lịch và thực hiện thay đổi cơ sở dữ liệu theo yêu cầu.

+1

Một ý tưởng khác là bao gồm 1 điểm cuối cron trong ứng dụng web/phi công việc chính của bạn, ứng dụng này chạy quản lý của «django-cron's] (http://django-cron.readthedocs.io/en/latest/)' runcrons' lệnh lập trình và tạo 1 điểm cuối ứng dụng công nhân yêu cầu điểm cuối của ứng dụng web. Một khóa tùy ý được biết bởi cả hai máy chủ (được gửi bởi nhân viên, được xác nhận bởi ứng dụng web) sẽ ngăn người dùng kích hoạt các crons của bạn. Lợi thế là không cần phải tái tạo lại bánh xe với các mô hình, kết nối cơ sở dữ liệu, v.v. trên công nhân. Tuy nhiên, nếu các crons là tài nguyên chuyên sâu và/hoặc thường xuyên, đó có thể là một vấn đề trên máy chủ web. – jmq

+0

@jmq Tôi thích giải pháp của bạn tốt hơn rất nhiều. Giải pháp của tôi yêu cầu nhân bản tất cả các mô hình của tôi thành một ứng dụng riêng biệt và kết nối với cùng một cơ sở dữ liệu, đó là một chút lộn xộn. – benedwards44

+0

Sau khi đối mặt với vấn đề này một lần nữa và xem xét nó nhiều hơn, kịch bản tốt nhất với tôi bây giờ có vẻ là để chỉ phát triển 'cron.yaml' trong repo chính của bạn và đẩy một bản sao của codebase của bạn đến máy chủ công nhân. Trong khi điều đó không cảm thấy rất DRY theo một cách (rằng bạn chỉ đang chạy mã đầy đủ trên 2 máy chủ và mục đích của chúng là khác nhau), nó giảm tải công việc thực tế của các tác vụ cron xuống tầng công nhân, là điểm AWS 'cung cấp tầng đó. Nó cũng giảm thiểu/loại bỏ mã mới từ cần phải được viết (trái với bình luận đầu tiên của tôi ở trên). – jmq

Các vấn đề liên quan