Tôi thực sự đã sử dụng cả hai trong một môi trường thương mại với sự hợp lý.
Câu trả lời ngắn gọn là trừ khi có các trường hợp góc cụ thể, tốt hơn là bạn nên sử dụng AWS SQS. (Bạn có thể bỏ qua phần cuối để xem tóm tắt đơn giản)
Mã hóa (Tie): RabbitMQ và AWS SQS đều có thư viện thiết lập và rất nhiều ví dụ.
Thời gian chờ hiển thị (SQS): Một điều mà SQS cung cấp trên RabbitMQ là khái niệm rộng hơn về thời gian chờ hiển thị. Trong RabbitMQ, nếu người tiêu dùng chết trước khi nó hoạt động, các thông báo sẽ được đưa trở lại hàng đợi. Nhưng SQS có một khái niệm rộng hơn về thời gian chờ hiển thị không bị ràng buộc với một người gọi cụ thể. Vì vậy, bạn có thể bắt đầu một đơn vị công việc, đặt chế độ hiển thị với thời gian chờ lớn (tối đa 12 giờ), ngắt kết nối, nhờ một nhân viên khác hoàn thành và tiếp tục. Trong thiết kế của tôi, chúng tôi tận dụng điều này một cách rộng rãi và loại bỏ dịch vụ / bộ nhớ bổ sung để quản lý khối lượng lớn tiềm ẩn 'đang xử lý'.
Xử lý thư chết (RabbitMQ - bởi một 'thỏ rừng') SQS cung cấp việc gửi thư chết cơ bản mà họ gọi là "Chính sách điều khiển lại" đưa thư vào Hàng đợi Thư chết (chỉ là một hàng đợi khác). Nó cơ bản và chỉ có khái niệm về số lượng tin nhắn. RabbitMQ có Trao đổi thư chết cung cấp các thư được đẩy vào DLE khi chúng hết hạn. Nhưng đây là một cuộc tranh luận giống như ý tưởng "Nếu bạn không xem các dịch vụ và tin nhắn của mình hết hạn, thì nó sẽ hạ cánh trong DLE". Đó là một chiến thắng nhẹ cho RabbitMQ vì tôi thấy rằng phản đối lập luận đó trực quan. Tại sao bạn lại giám sát hàng đợi của mình mà không phải các dịch vụ của bạn? (Nếu có gì thì ngược lại)
Quản trị (SQS): Không có quản trị đối với SQS. Bạn chỉ cần trả tiền cho các cuộc gọi API. Tất cả các vấn đề đau đầu thông thường như bản vá bảo mật hệ điều hành / ứng dụng, quy mô (thêm nhiều nút), đĩa đều do nhóm AWS xử lý. Nó cũng tuân thủ FedRamp (cho chính phủ sử dụng). Nó thực sự là một hệ thống 'thiết lập và quên đi'. Trong trường hợp RabbitMQ yêu cầu các bản vá hệ điều hành / dịch vụ thông thường, AMI, phân cụm, tăng cường bảo mật, v.v. Mặc dù rất hiếm, nhưng AMI có thể giảm hoặc đôi khi yêu cầu di chuyển xung quanh vì vậy cần phân cụm ngay lập tức. SQS loại bỏ tất cả những đau đầu.
CHI PHÍ (SQS): Một lệnh gọi API SQS có thể bao gồm 'hàng loạt tối đa 10 thư / kích thước 256k' và 'bỏ phiếu dài' có thể cắt giảm đáng kể chi phí. Hơn nữa, có những chiến lược như nén tin nhắn để đẩy hàng chục (một số yêu cầu hàng trăm hoặc nhiều hơn) tin nhắn có thể được gửi trong một trọng tải duy nhất để giảm chi phí hơn nữa. Và đây là trước khi chúng ta xem xét thời gian mọi người dành để giám sát / vá / sửa các vấn đề. SQS cũng tuyệt vời cho các 'dự án poc' như thể nó không hoạt động, không tốn phí.
FIFO (TIE): Vào năm 2016, AWS đã giới thiệu hỗ trợ FIFO với chi phí bổ sung là ~ 0,01 đô la / triệu lệnh gọi api (0,05 đô la so với 0,04 đô la cho tất cả các API - trước khi giảm giá). Bạn có thể chọn sử dụng FIFO hoặc không. Đối với không phải FIFO, chúng tôi hiếm khi thấy các thông báo trùng lặp.
Lưu trữ (SQS): AWS không tính phí lưu trữ nhưng bạn có giới hạn là 14 ngày. Trên RabbitMQ, bạn sẽ phải phân bổ, mở rộng và quản lý không gian đĩa yêu cầu dung lượng lưu trữ cao nhất cộng với bộ đệm bổ sung. Nó chỉ là đau đầu hơn.
Số liệu (SQS): SQS cung cấp các số liệu ngoài hộp. Và trong khi bạn có thể thêm chúng vào AWS, nó chỉ là công việc nhiều hơn.
Nhà phát triển địa phương (cà vạt): Hầu hết các cửa hàng hiện đại thích có môi trường địa phương. Hiện có một số tùy chọn cho phép các docker của RabbitMQ và SQS.
Thông lượng cao / thông báo rất lớn (RabbitMQ - đại loại) Khi bạn đẩy SQS> 1000 yêu cầu / giây, độ trễ của SQS sẽ tăng lên. Có một số chiến lược để vượt qua nó. Nhưng tôi thấy những trường hợp này là cực kỳ hiếm vì hầu hết công việc có thể được phân vùng thành nhiều hàng đợi. Nhưng với những trường hợp cần 100k / giây như thế này thì mình nghĩ Kafka tốt hơn. (Chúng tôi cũng sử dụng Kafka trong công việc của tôi) Rất hiếm khi có một đơn vị công việc nào đòi hỏi hơn 1000 yêu cầu / giây với độ trễ thấp. * Xem thêm bên dưới để giải thích điều này
Tóm tắt: Nếu bạn sẽ gia nhập AWS và sẵn sàng kết hôn với SQS, thì SQS là điều không cần bàn cãi. Nhưng bạn nên đọc tiếp vì có những điều quan trọng cần xem xét.
Chiến lược cổ điển cho RabbitMQ (và các hàng đợi khác) là tạo một số loại hàng đợi được tối ưu hóa cho một số loại công việc nhất định. Sau đó, tinh chỉnh từng hàng đợi này và nhóm các công việc tương tự thành một số nhỏ trong số các hàng đợi này (thường có kích thước rất lớn). Vì SQS không có chi phí quản trị, thực sự tốt hơn là phân bổ hàng đợi dành riêng cho từng công việc. Bằng cách đó, nó cho phép mở rộng quy mô nhưng cũng loại bỏ tình trạng bão hòa hàng đợi (công việc vi phạm làm bão hòa hàng đợi và át đi những người lao động khác), xem tốt hơn công việc (số liệu mặc định), v.v.
Chiến lược mới đã cho phép các nhóm của tôi có cái nhìn tốt hơn về cách phân bổ công việc. Đã qua rồi thời 'nâng cấp phiên bản để tải nhiều hơn'. Trước đây, chúng tôi sẽ thấy một sự gia tăng đột biến lớn không giải thích được có thể gây ra tác dụng phụ cho các dịch vụ khác hoặc chỉ đoán rằng các con số tích lũy có vẻ đúng '. Bây giờ lưu lượng truy cập được tách biệt, chúng tôi thực sự đã phát hiện ra nhiều vấn đề mà trước đây không được chú ý và có thể giải thích rõ ràng lượng lưu lượng truy cập đang đi đến đâu. Và trong khi rất có thể triển khai các chỉ số và công cụ, SQS cung cấp tất cả những điều này.
Vẫn có những trường hợp tuyệt vời nên xem xét nghiêm túc RabbitMQ
- Very large legacy code base that uses RabbitMQ with extensive tooling and knowledgeable support staff
- Messages that needs to be in the same work stream for > 14 days
- Very large messages that has very low latency requirements with it
- Cloud agnostic code base requirements. If you must run your code on other platforms (e.g. Azure/Google/bare metal), then SQS is not an option
- Large volume of data for a single pipeline that can't be broke up and other solutions (e.g. Kafka) are not viable. But at a super large volume, Kafka is a lot faster. While SQS will push large payloads to S3, you are now incurring additional cost.