Tin tức và phân tích của tất cả các thiết bị di động

6 hệ thống xếp hàng tốt nhất cho các nhà phát triển phụ trợ

Tìm kiếm một hệ thống xếp hàng? Hay bạn đang tìm kiếm một cái tốt hơn? Đây là tất cả các thông tin bạn cần!

Hệ thống xếp hàng là bí mật tốt nhất được giữ bí mật của sự phát triển phụ trợ.

Nếu không cố gắng viết một dòng ca ngợi hệ thống xếp hàng, tôi sẽ nói rằng một nhà phát triển phụ trợ cấp dưới sẽ trở thành nhà phát triển phụ trợ cấp trung sau khi học cách tích hợp hàng đợi vào hệ thống. Hàng đợi cải thiện trải nghiệm của khách hàng (chúng ta sẽ xem cách thực hiện), giảm độ phức tạp và cải thiện độ tin cậy của hệ thống.

Tất nhiên, đối với các ứng dụng web rất đơn giản với lưu lượng truy cập gần như bằng không và các trang quảng cáo, hàng đợi có thể nói chung (hoặc thậm chí không thể cài đặt nếu bạn đang ở trong một môi trường lưu trữ chia sẻ điển hình) nhưng các ứng dụng không tầm thường sẽ được hưởng lợi từ hệ thống hàng đợi và các ứng dụng lớn là không thể nếu không có một hàng đợi.

Trước khi chúng tôi bắt đầu, xin lưu ý: nếu bạn đã quen thuộc với các hệ thống xếp hàng và muốn so sánh các tùy chọn khác nhau, một vài phần giới thiệu tiếp theo sẽ khiến bạn mất ngủ rất nhiều. 🙂 Vì vậy, hãy thoải mái nhảy về phía trước. Các phần giới thiệu dành cho những người chỉ có một ý tưởng mơ hồ về hệ thống xếp hàng hoặc chỉ mới nghe qua tên.

Hệ thống xếp hàng là gì?

Hãy bắt đầu bằng cách hiểu hàng đợi là gì.

Hàng đợi là một cấu trúc dữ liệu trong khoa học máy tính bắt chước hàng đợi trong thế giới thực mà chúng ta thấy xung quanh mình. Ví dụ, nếu bạn đến phòng vé, bạn sẽ nhận thấy rằng bạn sẽ phải đứng ở cuối hàng trong khi người ở đầu hàng lấy vé trước. Đây là cái mà chúng tôi gọi là hiện tượng “đến trước được phục vụ trước”. Trong khoa học máy tính, có thể viết các chương trình chứa các nhiệm vụ như vậy trong một hàng đợi, xử lý từng nhiệm vụ một trên cơ sở ai đến trước được phục vụ trước.

Lưu ý rằng bản thân hàng đợi không thực hiện bất kỳ quá trình xử lý nào. Nó chỉ là nơi lưu trữ tạm thời nơi các tác vụ chờ thứ gì đó thực hiện chúng. Nếu tất cả những điều này nghe có vẻ quá trừu tượng, đừng lo lắng. Đây là một khái niệm trừu tượng, nhưng chúng ta sẽ thấy một số ví dụ rõ ràng trong phần tiếp theo.

Tại sao bạn cần hệ thống xếp hàng?

Không đi sâu vào mô tả dài dòng, tôi sẽ nói rằng nhu cầu chính của hệ thống xếp hàng là xử lý nền, thực thi song song và khôi phục sự cố. Hãy xem xét nó với các ví dụ:

xử lý nền

Giả sử bạn đang chạy chiến dịch tiếp thị thương mại điện tử nhạy cảm với thời gian và ứng dụng của bạn được tạo để gửi email xác nhận ngay trước khi khách hàng hoàn tất thanh toán và hiển thị trang cảm ơn. Nếu máy chủ thư bạn kết nối bị hỏng, trang web sẽ chết, làm gián đoạn trải nghiệm người dùng của bạn.

Hãy tưởng tượng số lượng lớn các yêu cầu hỗ trợ mà bạn sẽ nhận được! Trong trường hợp này, tốt hơn là ủy thác nhiệm vụ gửi email này đến hàng đợi nhiệm vụ và hiển thị trang thành công cho khách hàng.

Thực hiện song song

Nhiều nhà phát triển, đặc biệt là những người chủ yếu viết mã các ứng dụng đơn giản hơn, lưu lượng truy cập thấp, có thói quen sử dụng các công việc định kỳ để xử lý nền. Điều này vẫn ổn cho đến khi kích thước của đầu vào trở nên lớn đến mức không thể làm sạch được. Ví dụ: giả sử bạn có một công việc định kỳ biên dịch các báo cáo phân tích và gửi chúng qua email cho người dùng và hệ thống của bạn có thể xử lý 100 báo cáo mỗi phút.

Ngay khi ứng dụng của bạn phát triển và bắt đầu nhận được trung bình hơn 100 yêu cầu mỗi phút, nó sẽ ngày càng tụt hậu và sẽ không bao giờ có thể hoàn thành tất cả các tác vụ.

Trong một hệ thống xếp hàng, tình huống này có thể tránh được bằng cách thiết lập nhiều nhân viên, mỗi nhân viên có thể chọn một nhiệm vụ (với 100 báo cáo mỗi người để chạy) và làm việc song song để hoàn thành nhiệm vụ nhanh hơn nhiều.

khắc phục thảm họa

Chúng tôi thường không nghĩ về những thất bại với tư cách là nhà phát triển web. Chúng tôi chấp nhận rằng các máy chủ và API mà chúng tôi sử dụng sẽ luôn trực tuyến. Nhưng thực tế thì khác – sự cố mất mạng quá phổ biến và các API tuyệt vời mà bạn dựa vào có thể không hoạt động do sự cố cơ sở hạ tầng (trước khi bạn nói “không phải tôi!”, đừng quên sự cố lớn Amazon S3). Vì vậy, hãy quay lại ví dụ về báo cáo, nếu một phần của quá trình tạo báo cáo yêu cầu kết nối với API thanh toán và kết nối này không hoạt động đối với 2 phút, điều gì xảy ra với 200 báo cáo không thành công?

Tuy nhiên, hệ thống xếp hàng đi kèm với một chi phí đáng kể. Đường cong học tập khá dốc khi bạn nhập một miền hoàn toàn mới, độ phức tạp của ứng dụng và triển khai tăng lên và các tác vụ trong hàng đợi không phải lúc nào cũng được kiểm soát với độ chính xác 100%. Điều đó nói rằng, có những lúc việc xây dựng một ứng dụng không có hàng đợi là không thể.

Bỏ vấn đề đó sang một bên, chúng ta hãy xem xét một số tùy chọn phổ biến giữa các hệ thống phụ trợ/xếp hàng.

làm lại

Redis được biết đến như một kho lưu trữ khóa-giá trị lưu trữ, cập nhật và truy xuất các chuỗi dữ liệu mà không cần biết cấu trúc dữ liệu. Mặc dù điều này có thể đúng trước đây, nhưng ngày nay Redis có các cấu trúc dữ liệu hiệu quả và rất hữu ích như danh sách, bộ được sắp xếp và thậm chí cả hệ thống Pub-Sub, khiến nó rất được ưa chuộng để triển khai hàng đợi.

Ưu điểm của Redis là:

  • Hoàn toàn trong bộ nhớ cơ sở dữ liệu, giúp đọc/ghi nhanh hơn.
  • Hiệu suất cao: Nó có thể dễ dàng xử lý hơn 100.000 thao tác đọc/ghi mỗi giây.
  • Đề án kiên trì linh hoạt cao. Bạn có thể chọn hiệu suất tối đa với khả năng mất dữ liệu có thể xảy ra trong trường hợp xảy ra lỗi hoặc định cấu hình chế độ bảo toàn hoàn toàn để hy sinh hiệu suất cho tính nhất quán.
  • Các cụm được hỗ trợ ngay lập tức

Lưu ý rằng Redis không có bất kỳ tóm tắt nhắn tin/xếp hàng/truy xuất nào, vì vậy bạn sẽ phải sử dụng một gói hoặc tự xây dựng một hệ thống nhẹ. Một ví dụ là Redis là phần phụ trợ hàng đợi mặc định cho khung công tác Laravel PHP nơi bộ lập lịch đã được các tác giả của khung triển khai.

Học Redis thật dễ dàng.

chú thỏMQ

Có một vài sự khác biệt tinh tế giữa Redis và RabbitMQ, vì vậy trước tiên hãy loại bỏ chúng.

Trước hết, RabbitMQ có một vai trò chuyên biệt hơn, được xác định rõ ràng hơn và do đó được xây dựng để phản ánh điều đó – nhắn tin. Nói cách khác, điểm hấp dẫn của nó là hoạt động như một trung gian giữa hai hệ thống, điều này không xảy ra với Redis hoạt động như một cơ sở dữ liệu. Do đó, RabbitMQ cung cấp một số tiện ích bổ sung mà Redis thiếu: định tuyến thư, thử lại, phân phối tải, v.v.

Nếu bạn nghĩ về nó, hàng đợi công việc cũng có thể được coi là một hệ thống nhắn tin trong đó người lập lịch trình, công nhân và “người gửi” công việc đều có thể được coi là tham gia vào việc nhắn tin.

RabbitMQ có những ưu điểm sau:

  • Tóm tắt tốt hơn cho nhắn tin, giảm công việc ở cấp ứng dụng nếu nhắn tin là thứ bạn cần.
  • Linh hoạt hơn khi mất điện và mất điện (ít nhất là theo mặc định so với Redis).
  • Hỗ trợ cụm và liên kết để triển khai phân tán.
  • Các công cụ hữu ích để quản lý và giám sát việc triển khai.
  • Hỗ trợ cho hầu như tất cả các ngôn ngữ lập trình không tầm thường.
  • Triển khai bằng công cụ bạn chọn (Docker, Chef, Puppet, v.v.).

Khi nào nên sử dụng RabbitMQ? Tôi muốn nói rằng đó là một lựa chọn tuyệt vời khi bạn biết mình cần sử dụng tính năng nhắn tin không đồng bộ, nhưng chưa sẵn sàng đối phó với sự phức tạp to lớn của một số tùy chọn xếp hàng khác trong danh sách này (xem bên dưới).

ActiveMQ

Nếu bạn quan tâm đến không gian công ty (hoặc xây dựng ứng dụng quy mô lớn và phân tán cao) và không muốn tiếp tục phát minh lại bánh xe (và mắc lỗi trong quá trình thực hiện), thì ActiveMQ rất đáng để xem xét.

Đây là nơi ActiveMQ vượt trội:

  • Nó được triển khai bằng Java nên nó có tích hợp Java thực sự gọn gàng (tuân thủ JMS).
  • Hỗ trợ đa giao thức: AMQP, MQTT, STOMP, OpenWire, v.v.
  • Nó chăm sóc bảo mật, định tuyến, hết hạn tin nhắn, phân tích, v.v. ngay lập tức.
  • Hỗ trợ tích hợp cho các mẫu thông báo phân tán phổ biến, tiết kiệm thời gian và các lỗi tốn kém.

Điều này không có nghĩa là ActiveMQ chỉ có sẵn cho Java. Nó có ứng dụng khách cho Python, C/C++, Node, .Net và các hệ sinh thái khác, vì vậy không cần lo lắng về sự sụp đổ có thể xảy ra trong tương lai. Ngoài ra, ActiveMQ được xây dựng trên các tiêu chuẩn hoàn toàn mở và việc xây dựng các ứng dụng khách nhẹ của riêng bạn sẽ trở nên dễ dàng.

Tất cả đã nói và làm, hãy nhớ rằng ActiveMQ chỉ là một nhà môi giới và không chứa phần phụ trợ. Bạn vẫn sẽ cần sử dụng một trong các chương trình phụ trợ được hỗ trợ để lưu trữ tin nhắn của mình. Tôi đặt nó ở đây vì nó không bị ràng buộc với một ngôn ngữ lập trình cụ thể (như các giải pháp phổ biến khác như Celery, Sidekiq, v.v.)

Amazon MQ

Amazon MQ xứng đáng được đề cập nhanh chóng nhưng quan trọng. Nếu bạn cho rằng ActiveMQ là giải pháp hoàn hảo cho nhu cầu của mình, nhưng bạn không muốn tự mình xây dựng và bảo trì cơ sở hạ tầng, Amazon MQ cung cấp dịch vụ được quản lý cho mục đích này. Nó hỗ trợ tất cả các giao thức mà ActiveMQ hỗ trợ – không có sự khác biệt về tính năng – vì nó sử dụng chính ActiveMQ dưới bề mặt.

Ưu điểm là nó là một dịch vụ được quản lý, vì vậy bạn không phải lo lắng về bất cứ điều gì khác ngoài việc sử dụng nó. Điều này thậm chí còn có ý nghĩa hơn đối với các triển khai trên AWS, vì bạn có thể tận dụng các dịch vụ và ưu đãi khác ngay từ quá trình triển khai (ví dụ: truyền dữ liệu nhanh hơn).

Amazon SQS

Chúng ta không thể mong đợi điều đó Amazon sẽ giữ im lặng khi nói đến các yếu tố cơ sở hạ tầng quan trọng, phải không?

Và vì vậy chúng tôi có Amazon SQS, một dịch vụ xếp hàng đơn giản, được lưu trữ đầy đủ (theo nghĩa đen) của gã khổng lồ nổi tiếng AWS. Một lần nữa, sự khác biệt tinh tế rất quan trọng, vì vậy hãy nhớ rằng SQS không có khái niệm về việc truyền thông điệp. Giống như Redis, nó là một chương trình phụ trợ đơn giản để chấp nhận và phân phối các công việc trong hàng đợi.

Vậy khi nào bạn muốn sử dụng Amazon SQS? Dưới đây là một số lý do:

  • Bạn là một người hâm mộ AWS và bạn sẽ không chạm vào bất cứ thứ gì khác (thành thật mà nói, có rất nhiều người như vậy và tôi không nghĩ có gì sai với điều đó).
  • Bạn cần một giải pháp được lưu trữ, vì vậy hãy đảm bảo rằng tỷ lệ thất bại của bạn bằng 0 và không có nhiệm vụ nào của bạn bị mất.
  • Bạn không muốn xây dựng một cụm và phải tự giám sát nó. Hoặc tệ hơn, bạn cần xây dựng các công cụ giám sát khi bạn có thể sử dụng thời gian đó để phát triển năng suất.
  • Bạn đã có một khoản đầu tư đáng kể vào nền tảng AWS và việc bị khóa trong đó có ý nghĩa kinh doanh.
  • Bạn cần một hệ thống xếp hàng tập trung, đơn giản mà không cần quá nhiều thông tin, giao thức, v.v.

Tóm lại, Amazon SQS là một lựa chọn vững chắc cho bất kỳ ai muốn kết hợp hàng đợi công việc vào hệ thống của họ và không phải lo lắng về việc tự cài đặt/giám sát mọi thứ.

cây đậu

Beanstalk đã xuất hiện từ lâu và là một công cụ phụ trợ xếp hàng công việc nhanh chóng và dễ dàng đã được chứng minh trong trận chiến. Có một số tính năng của Beanstalkd khiến nó khác biệt đáng kể so với Redis:

  • Đó là một hệ thống xếp hàng công việc và không có gì khác. Bạn đẩy đến nơi làm việc này, sau đó được nhân viên rút ra. Vì vậy, nếu ứng dụng của bạn thậm chí có nhu cầu nhắn tin nhỏ, bạn muốn tránh Beanstalkd.
  • Không có cấu trúc dữ liệu nâng cao như bộ, hàng đợi ưu tiên, v.v.
  • Beanstalkd được gọi là hàng đợi Nhập trước, Xuất trước (FIFO). Không thể tổ chức các nhiệm vụ theo mức độ ưu tiên.
  • Không có tùy chọn phân cụm.

Tất cả những gì đã nói, Beanstalkd tạo ra một hệ thống xếp hàng gọn gàng và nhanh chóng cho các dự án đơn giản chạy trên một máy chủ. Đối với nhiều người, nó nhanh hơn và ổn định hơn Redis. Vì vậy, nếu bạn gặp vấn đề về Redis mà bạn không thể giải quyết bằng mọi giá và nhu cầu của bạn rất đơn giản, thì Beanstalkd rất đáng để thử.

Đăng kí

Nếu bạn đã đọc đến đây (hoặc đọc lướt qua ở đây 😉), rất có thể bạn quan tâm hoặc cần hệ thống xếp hàng. Nếu vậy, danh sách trên trang này sẽ phục vụ tốt cho bạn, trừ khi bạn đang tìm kiếm một hệ thống xếp hàng dành riêng cho ngôn ngữ/khuôn khổ.

Tôi ước mình có thể nói việc xếp hàng đơn giản và đáng tin cậy 100%, nhưng không phải vậy. Nó rất lộn xộn và bởi vì mọi thứ đều ở chế độ nền và diễn ra rất nhanh (những sai lầm có thể không bị phát hiện và trở nên rất tốn kém). Tuy nhiên, hàng đợi rất cần thiết sau một thời điểm nhất định và bạn sẽ thấy rằng chúng là vũ khí mạnh mẽ (thậm chí có thể là mạnh nhất) trong kho vũ khí của bạn. Chúc may mắn!