Để tốt hơn hay tệ hơn, chúng tôi đã di chuyển toàn bộ ứng dụng web LAMP của mình từ các máy chuyên dụng sang đám mây (máy Amazon EC2). Cho đến nay mọi thứ đã rất tuyệt vời nhưng cách chúng tôi làm crons là chưa tối ưu. Tôi có một câu hỏi dành riêng cho Amazon về cách quản lý tốt nhất các công việc cron trên đám mây bằng cách sử dụng "cách Amazon".
Vấn đề : Chúng tôi có nhiều máy chủ web, và cần chạy các phần mềm cho các công việc hàng loạt như tạo nguồn cấp RSS, kích hoạt email, thực tế là nhiều thứ khác nhau. NHƯNG các công việc cron chỉ cần chạy trên một máy vì chúng thường ghi vào cơ sở dữ liệu nên sẽ trùng lặp kết quả nếu chạy trên nhiều máy.
Cho đến nay, chúng tôi đã chỉ định một trong những máy chủ web là "máy chủ web chính" và nó có một vài nhiệm vụ "đặc biệt" mà các máy chủ web khác không có. Sự đánh đổi của điện toán đám mây là độ tin cậy - chúng tôi không muốn có một "máy chủ web chính" vì đó là một điểm thất bại duy nhất. Chúng tôi muốn tất cả chúng giống hệt nhau và có thể nâng cấp và giảm tỷ lệ mà không cần nhớ rằng không đưa master-webserver ra khỏi cụm.
Làm cách nào chúng ta có thể thiết kế lại ứng dụng của mình để chuyển đổi các công việc cron Linux thành các mục công việc tạm thời mà không có một điểm lỗi nào?
Ý tưởng của tôi cho đến nay:
- Có một máy chuyên dụng để chỉ chạy crons. Điều này sẽ dễ quản lý hơn một chút nhưng vẫn sẽ là một điểm thất bại duy nhất và sẽ lãng phí một số tiền nếu có thêm một phiên bản.
- Một số công việc có thể được chuyển từ Linux crons sang MySQL Events, tuy nhiên tôi không phải là một fan hâm mộ lớn của ý tưởng này vì tôi không muốn đưa logic ứng dụng vào lớp cơ sở dữ liệu.
- Có lẽ chúng ta có thể chạy tất cả các crons trên tất cả các máy nhưng thay đổi các tập lệnh cron của chúng ta để tất cả chúng bắt đầu với một chút logic thực hiện cơ chế khóa để chỉ một máy chủ thực sự thực hiện hành động và các máy chủ khác bỏ qua. Tôi không phải là người yêu thích ý tưởng này vì nó nghe có vẻ có lỗi và tôi muốn sử dụng phương pháp hay nhất của Amazon hơn là áp dụng phương pháp của chúng tôi.
- Tôi đang tưởng tượng một tình huống mà các công việc được lên lịch ở đâu đó, được thêm vào một hàng đợi và sau đó các máy chủ web có thể là một công nhân, có thể nói "này, tôi sẽ nhận cái này". Dịch vụ Quy trình Công việc Đơn giản của Amazon nghe có vẻ chính xác là loại điều này nhưng tôi hiện không biết nhiều về nó vì vậy mọi chi tiết cụ thể sẽ hữu ích. Nó có vẻ khá nặng đối với một thứ đơn giản như cron? Đó có phải là dịch vụ phù hợp hay có dịch vụ Amazon phù hợp hơn không?
Cập nhật: Kể từ khi đặt câu hỏi, tôi đã xem hội thảo trên web về Dịch vụ quy trình làm việc đơn giản của Amazon trên YouTube và nhận thấy lúc 34:40 ( http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s ), tôi đã thoáng thấy một slide đề cập đến công việc cron như một ứng dụng mẫu. Trong trang tài liệu của họ, "Các mẫu AWS Flow Framework cho Amazon SWF ", Amazon cho biết họ có mã mẫu cho crons:
... > Các công việc Cron Trong mẫu này, một dòng công việc chạy dài thực hiện định kỳ một hoạt động. Khả năng tiếp tục thực thi dưới dạng thực thi mới để một thực thi có thể chạy trong một khoảng thời gian rất dài được chứng minh. ...
Tôi đã tải xuống AWS SDK cho Java ( http://aws.amazon.com/sdkforjava/ ) và chắc chắn rằng đủ để chôn vùi trong một lớp thư mục vô lý có một số mã java ( aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
).
Vấn đề là, nếu tôi trung thực, điều này không thực sự hữu ích vì nó không phải là thứ tôi có thể dễ dàng hiểu được với bộ kỹ năng của mình. SDK PHP bị thiếu cùng một mẫu và dường như không có hướng dẫn nào hướng dẫn quy trình này. Vì vậy, về cơ bản, tôi vẫn đang tìm kiếm lời khuyên hoặc mẹo.