Tại sao Redis cho xếp hàng?
Tôi có ấn tượng rằng Redis có thể là một ứng cử viên tốt để thực hiện một hệ thống xếp hàng. Cho đến thời điểm này, chúng tôi đã sử dụng cơ sở dữ liệu MySQL của chúng tôi với bỏ phiếu hoặc RabbitMQ. Với RabbitMQ, chúng tôi đã gặp nhiều vấn đề - các thư viện máy khách rất kém và có lỗi và chúng tôi không muốn đầu tư quá nhiều giờ của nhà phát triển để sửa chúng, một vài vấn đề với bảng điều khiển quản lý máy chủ, v.v. ít nhất, chúng ta không nắm bắt được mili giây hoặc hiệu suất đẩy nghiêm trọng, miễn là một hệ thống có kiến trúc hỗ trợ hàng đợi một cách thông minh, có lẽ chúng ta đang ở trong tình trạng tốt.
Được rồi, đó là nền tảng. Về cơ bản, tôi có một mô hình xếp hàng đơn giản, rất cổ điển - một số nhà sản xuất sản xuất công việc và một số người tiêu dùng tiêu thụ công việc, và cả nhà sản xuất và người tiêu dùng cần có khả năng mở rộng quy mô một cách thông minh. Hóa ra một người ngây thơ PUBSUB
không làm việc, vì tôi không muốn tất cả người đăng ký tiêu thụ công việc, tôi chỉ muốn một người đăng ký nhận công việc. Ở lần đầu tiên, có vẻ như tôi BRPOPLPUSH
là một thiết kế thông minh.
Chúng ta có thể sử dụng BRPOPLPUSH không?
Thiết kế cơ bản với BRPOPLPUSH
là bạn có một hàng đợi công việc và hàng đợi tiến độ. Khi một người tiêu dùng nhận được công việc, nó sẽ đẩy vật phẩm vào hàng đợi tiến độ và khi nó hoàn thành công việc thì đó LREM
là nó. Điều này ngăn chặn việc làm đen nếu khách hàng chết và khiến việc giám sát trở nên khá dễ dàng - ví dụ chúng ta có thể biết liệu có vấn đề gì khiến người tiêu dùng mất nhiều thời gian để thực hiện các nhiệm vụ hay không, ngoài việc cho biết nếu có khối lượng lớn nhiệm vụ.
Nó đảm bảo
- công việc được giao cho chính xác một người tiêu dùng
- làm việc trong một hàng đợi tiến bộ, vì vậy nó không thể là lỗ đen nếu người tiêu dùng
Hạn chế
- Nó có vẻ khá lạ đối với tôi rằng thiết kế tốt nhất mà tôi tìm thấy không thực sự sử dụng
PUBSUB
vì đây dường như là những gì hầu hết các bài đăng trên blog về việc xếp hàng trên Redis tập trung vào. Vì vậy, tôi cảm thấy như tôi đang thiếu một cái gì đó rõ ràng. Cách duy nhất tôi thấy để sử dụngPUBSUB
mà không tiêu thụ các tác vụ hai lần là chỉ cần đẩy một thông báo rằng công việc đã đến, mà người tiêu dùng sau đó có thể không chặn-lyRPOPLPUSH
. - Không thể yêu cầu nhiều hơn một mục công việc tại một thời điểm, đây dường như là một vấn đề về hiệu suất. Không phải là một vấn đề lớn đối với tình huống của chúng tôi, nhưng rõ ràng là hoạt động này không được thiết kế cho thông lượng cao hoặc tình huống này
- Tóm lại: tôi có thiếu điều gì ngu ngốc không?
Đồng thời thêm thẻ node.js, vì đó là ngôn ngữ mà tôi chủ yếu xử lý. Node có thể cung cấp một số đơn giản hóa trong việc triển khai, do tính chất đơn luồng và không chặn của nó, nhưng hơn nữa tôi đang sử dụng thư viện nút-redis và các giải pháp cũng nên hoặc có thể nhạy cảm với các điểm mạnh và điểm yếu của nó.