2015-12-16 22 views
9

Tôi có một máy chủ duy nhất chạy trên rackspace đang lưu trữ một ứng dụng web PHP duy nhất.Làm thế nào để sử dụng AWS SQS/SNS như một hàng đợi thông báo đẩy cho các tác vụ xử lý nặng thông qua PHP?

Ứng dụng web PHP sẽ chấp nhận gửi biểu mẫu, sau đó cần thực hiện tác vụ dựa trên các mục nhập trường biểu mẫu.

Nhiệm vụ (gọi là tác vụ tạo siêu dữ liệu) yêu cầu khá nhiều thời gian xử lý. Tôi đã tự hỏi làm thế nào để cho phép các hình thức nộp là một đơn giản lưu vào cơ sở dữ liệu và ngay lập tức hiển thị trang thành công cho người dùng trong khi chạy các tác vụ tạo siêu dữ liệu trong nền.

Tôi đã cài đặt "aws/aws-sdk-php": "~3.11" bằng cách sử dụng trình soạn nhạc vào cùng một ứng dụng web.

Kế hoạch của tôi là ban đầu này:

mã mà xử lý các hình thức trình

$result = $model->save($_POST); 
// this code will send the information to either SQS or SNS 
$awsClient->sendsMessage($_POST); 
if ($result) { 
    $this->redirect('success.html'); 
} 

Tôi đã đọc về fanout architecture nêu bởi AWS.

vấn đề của tôi với ví dụ kiến ​​trúc fanout (như tôi hiểu nó) là này:

  1. máy chủ sẽ gửi thông điệp cho một trong hai SQS hay SNS cũng sẽ có cùng một máy chủ mà xử lý các nhiệm vụ tạo ra siêu dữ liệu. Trong thực tế, đó là cùng một ứng dụng web.
  2. SQS đáp ứng phần hàng đợi (vì tôi muốn thực hiện các tác vụ trong FIFO và các tác vụ mất nhiều thời gian để hoàn thành). Tuy nhiên, nó đòi hỏi ứng dụng web của tôi để thăm dò ý kiến ​​SQS liên tục. Tôi muốn một thông báo đẩy (từ AWS đến ứng dụng web của tôi) hơn là ứng dụng web của tôi bỏ phiếu AWS liên tục để kiểm tra các nhiệm vụ thực thi.

Tôi tìm thấy một giải pháp khả thi đề nghị here

Các giải pháp được đề xuất là:

  1. gửi tin nhắn đến một chủ đề SNS.

  2. Chủ đề SNS sẽ gửi cả hàng đợi SQS và ứng dụng web của tôi.

  3. ứng dụng web của tôi, sau khi được kích hoạt, sẽ thăm dò ý kiến ​​hàng đợi SQS cùng mà bây giờ đã xếp hàng đợi thông điệp liên tục cho đến khi hàng đợi rỗng

Hạn chế tôi thấy từ này là ứng dụng web của tôi sẽ thăm dò hàng đợi trước khi hàng đợi có thông điệp.

Cách tốt nhất để triển khai hàng đợi đẩy bằng dịch vụ AWS là gì?

Trả lời

23

ứng dụng web của tôi sẽ thăm dò ý kiến ​​hàng đợi trước khi hàng đợi chính nó có thông điệp

Bạn đã không thử nó, sau đó, phải không? :) Tôi sợ rằng bạn đang overthinking này.SQS có yêu cầu bỏ phiếu dài, khiến yêu cầu thăm dò ý kiến ​​bị tạm ngưng ở phía SQS cho đến khi có ít nhất một thông báo, tại thời điểm đó thông báo đó (tối đa số bạn yêu cầu) sẽ được trả lại. Bạn có thể đặt thời gian chờ thăm dò ý kiến ​​từ 1 đến 20 giây. Nếu không có thông báo nào trong khung thời gian này, phản hồi sẽ được trả lại mà không có thư nào.

Nếu bạn thăm dò hàng đợi theo thông báo từ SNS, bạn sẽ tìm thư ở đó nếu bạn sử dụng tính năng bỏ phiếu dài. Có thể cho các thư bị trì hoãn nhưng không thể cao.

Vấn đề khác, là khẳng định của bạn rằng bạn không muốn ứng dụng liên tục bỏ phiếu SQS. Tôi gặp phải sự phản đối này khá thường xuyên, và nó thường bị thất lạc. Với việc bỏ phiếu dài SQS, "liên tục" bỏ phiếu một hàng đợi rỗng có nghĩa là một yêu cầu cứ 20 giây một lần. Đó là 3 req/phút, 180 req/giờ, 4320 req/ngày, 129600 req/tháng ... mà hóa ra là ít hơn 1 triệu yêu cầu miễn phí được phép mỗi tháng.

Sự cố với máy chủ của bạn phản ứng với thông báo thay vì bỏ phiếu hàng đợi ở chế độ nền với số lượng công nhân thích hợp là bạn có thể dễ dàng bị choáng ngợp bởi một lượng lớn công việc đến cùng lúc. Nếu bạn nhận được 10 yêu cầu đồng thời, bạn có thể xử lý yêu cầu đó không? 100? 1000? Thông thường, đối với công việc không đồng bộ như thế này, chi phí ít hơn (về mặt tài nguyên) để yêu cầu công việc hơn là thực hiện công việc (ví dụ: tải lên hình ảnh sẽ yêu cầu CPU ít hơn nhiều so với thay đổi kích thước hình ảnh đó). Trừ khi bạn phối hợp phản ứng phản ứng của bạn, bạn có thể áp đảo hệ thống của bạn.

Đừng rơi vào một cái bẫy khái niệm về "bỏ phiếu là xấu, đẩy là tốt", nơi nó không áp dụng. Phần lớn thời gian, tình cảm đó hoàn toàn chính xác ... việc bỏ phiếu hầu như luôn là giải pháp sai ... nhưng với cuộc thăm dò dài của SQS, những gì bạn thực sự có là một cơ chế đẩy được bao bọc theo cách làm cho nó tương thích với HTTP , và nhiều điều xấu xa trong việc bỏ phiếu ... biến mất. Nếu bạn đang ở giữa một cuộc thăm dò dài, hàng đợi trống, và một tin nhắn đến, cuộc thăm dò ý kiến ​​của bạn sẽ trở lại với tin nhắn đó gần như ngay lập tức. Nó không ngồi chờ đợi thời gian chờ xảy ra. Một quá trình nền xem hàng đợi có thể là một cách tốt để đi sau khi tất cả.

+0

Cảm ơn Gee. Tôi không nghĩ về nó như thế. Câu trả lời tuyệt vời! Tôi cho bạn thêm 50 điểm cho điều đó khi tiền thưởng có thể được mở vào ngày mai. –

+1

Xin lỗi. Chỉ bây giờ tôi mới trao cho bạn thêm 50 điểm –

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