Xuất bản / Đăng ký (hoặc pub / sub ) là một mô hình kỹ thuật phần mềm đã được sử dụng trong nhiều thập kỷ nhưng thường yêu cầu các máy chủ nhắn tin chuyên dụng và kiến thức chuyên môn để hữu ích.
Redis pub / sub là một triển khai đơn giản và đơn giản của mẫu xuất bản / đăng ký, vốn là một tính năng của tất cả các máy chủ Redis kể từ bản phát hành 2.0. Điều này có nghĩa là nó rất dễ sử dụng ở bất cứ nơi nào triển khai Redis và một hệ thống pub / sub đơn giản và nhanh chóng có thể được xây dựng nhanh chóng bằng cách triển khai Redis.
Để hiểu liệu Redis pub / sub có phù hợp với một ứng dụng hay không, điều quan trọng trước tiên là phải hiểu thiết kế và mục tiêu của pub / sub, sau đó xem xét các chi tiết cụ thể của việc triển khai Redis pub / sub.
Tổng quan về Pub / sub
Pub / sub design:tách "nhà xuất bản" khỏi "người đăng ký"
Giảm bớt sự phụ thuộc và phân chia kiến thức là những mục tiêu quan trọng khi thiết kế phần mềm có khả năng mở rộng. Bài báo đăng ký xuất bản / đăng ký, AKA pub / sub, phân tách các phần của phần mềm xuất bản của bạn thông báo từ các phần của phần mềm của bạn hoạt động trên tin nhắn. Để tìm hiểu điều này tốt hơn, hãy xem một số ví dụ:
Ví dụ về "nhà xuất bản"
- Một ứng dụng cho phép bạn gửi tin nhắn tới phòng trò chuyện
- Bộ chứa docker thông báo tình trạng hoặc dịch vụ của nó
- Một ứng dụng thông báo giá giao dịch chứng khoán
- Một bộ cảm biến nhiệt độ trong nhà của bạn thông báo việc đọc nó
- Một người phát tin nhắn trong một trò chơi nhiều người dùng (“Elon đã bị một ác quỷ ăn thịt”)
Ví dụ về "người đăng ký"
- Các ứng dụng nghe tin nhắn trong phòng trò chuyện.
- Một ứng dụng chuyển tiếp thông báo tới Slack
- Một khách hàng trên thiết bị di động được sử dụng để xem những gì đang xảy ra trong thời gian thực
- Một dịch vụ ghi nhật ký ghi lại các sự kiện để phân tích sau này
Mô hình quán rượu / phụ giúp bạn tránh suy nghĩ quá nhiều về người đăng ký khi làm việc trên nhà xuất bản , và ngược lại. Trong các ví dụ ở trên, chúng ta có thể hình dung tổng số người đăng ký quan tâm đến các tin nhắn từ bất kỳ trang web nào. Người đăng ký thậm chí có thể muốn nghe tất cả nhà xuất bản.
Trong pub / sub, nhà xuất bản không cần biết về người đăng ký của mình - nhà xuất bản gửi thông báo đến kênh (thường được gọi là một chủ đề trong các hệ thống khác) và chuyển động. Bất kỳ người đăng ký nào tình cờ nghe được trên kênh đó khi tin nhắn được xuất bản sẽ nhận được.
Người đăng ký được thiết kế để nghe một hoặc nhiều kênh và phản ứng với các tin nhắn đó khi họ truy cập. Nếu một người đăng ký không thể theo kịp tốc độ của các tin nhắn được công bố, thì sẽ bỏ lỡ một số tin nhắn. Đây là một thiết kế hữu ích:cho phép hệ thống mở rộng quy mô vượt quá khả năng của bất kỳ người đăng ký chậm nào.
Mục tiêu của Pub / sub:phân phối theo quy mô, không phải khối lượng công việc
Pub / sub là một mẫu được sử dụng trong phần mềm điều chỉnh tỷ lệ - điều quan trọng là phải hiểu loại chia tỷ lệ mà nó giúp ích được gì. Một điểm khác biệt quan trọng là giữa tin nhắn pub / suband xếp hàng .
Trong mẫu xếp hàng, một hàng đợi (hoặc danh sách trong Redis) vào bộ đệm các thư cần xử lý trong khi một nhóm công nhân đưa các mục ra khỏi danh sách và xử lý. Trong mô hình này, việc mở rộng quy mô của nhóm nhân viên của bạn sẽ chia tỷ lệ với tốc độ mà bạn xử lý hàng đợi của mình, vì mỗi thông báo chỉ được chuyển cho một nhân viên. Tất cả các nhân viên xử lý bất kỳ thông báo nhất định nào theo cùng một cách.
Mặt khác, trong pub / sub, hệ thống cố gắng phân phối tất cả các thông báo của kênh cho tất cả người đăng ký của kênh đó. Đó là một mô hình nhiều-nhiều, trong đó mỗi người đăng ký khác nhau làm điều gì đó độc đáo với tin nhắn - một người viết nó vào nhật ký bền, một người gửi nó đến kênh Slack, một người rung chuông trong văn phòng bán hàng địa phương, v.v.
Nói tóm lại, pub / sub scale thông điệp giao hàng và thông báo về quy mô xếp hàng xử lý khối lượng công việc . Redis thường được sử dụng cho cả hai mục tiêu này. SeeSidekiq để biết một ví dụ phổ biến về xếp hàng với Redis.
Redis pub / sub speculars
Pub / sub là một mô hình đã có từ rất lâu, và trong khi mô hình cốt lõi giống nhau, các tính năng cụ thể khác nhau đáng kể từ việc thực hiện đến triển khai.
Redis pub / sub là một triển khai nhanh, gọn nhẹ. Để hiểu rõ nhất về thiết kế của nó, sẽ rất hữu ích khi xem xét một số tính năng không một phần củaRedis pub / sub:
- Không tồn tại lâu dài hoặc lưu vào bộ nhớ đệm giá trị
- Không có đảm bảo giao hàng
- Chưa có tối ưu hóa cụm…
Không kiên trì:“Nhưng tôi nghĩ nó giống như một phòng trò chuyện…”
Không giống như hầu hết các hoạt động Redis, có thể được ghi vào đĩa, Redispub / sub không liên tục. Các tin nhắn đã xuất bản được chuyển trực tiếp đến người đăng ký và sau đó bị loại bỏ, không có bản ghi nào được lưu lại trong bộ nhớ của Redis hoặc ondisk.
Điều này đôi khi có thể gây nhầm lẫn cho những người dùng mới nghe nói rằng Redis pub / sub thường được sử dụng để triển khai các phòng trò chuyện. Nhiều người trong chúng ta coi các công cụ như Slack như phòng trò chuyện - bạn đăng nhập và xem các tin nhắn gần đây và sau đó nhận tất cả các mới. Trên thực tế, "xem các tin nhắn gần đây" hoàn toàn không phải là một phần của pub / sub, và phải được xử lý bằng một phương tiện riêng biệt. Pub / sub chỉ tạo điều kiện cho việc gửi những thông điệp mới. Theo nghĩa này pub / sub giống như một luồng trực tiếp - khi bạn bật nó lên, bạn sẽ bắt đầu nhận được thông tin, nhưng bạn không tìm hiểu bất cứ điều gì về những gì đã xảy ra trước khi bật. Ngoài ra:Trò chuyện chuyển tiếp qua Internet (IRC) sử dụng mô hình pub / sub mà không có lịch sử tích hợp hoặc lưu giữ tin nhắn - đó là lý do tại sao chat roommetaphor lại rất phổ biến.
Trên thực tế, bạn vẫn có thể triển khai một phòng trò chuyện với Redis và pub / sub. Để làm như vậy, bạn đảm bảo rằng các thư không chỉ được xuất bản mà còn được đưa vào danh sách để người dùng có thể xem lịch sử tin nhắn.
Không có đảm bảo giao hàng
Người đăng ký không được đảm bảo sẽ nhận được tin nhắn trong mô hình pub / sub. Nếu người đăng ký gặp sự cố kết nối mạng, không thể đọc tin nhắn đủ nhanh, hoặc có vẻ như không được đính kèm khi tin nhắn được xuất bản, nó sẽ không nhận được tin nhắn đó. Nhà xuất bản có thể gửi tin nhắn đến các kênh ngay cả khi không có người đăng ký nào đang nghe - những tin nhắn đó sẽ bị loại bỏ.
Một số hệ thống nhắn tin khác sử dụng biên nhận đã đọc hoặc “acks” hoặc có thể lưu trữ bộ đệm cho một người đăng ký để bảo vệ tránh bị ngắt kết nối trong thời gian ngắn. Redis chọn tùy chọn đơn giản ở đây:nếu bạn bỏ lỡ một tin nhắn, bạn đã bỏ lỡ tin nhắn. Thông báo phải đến người nhận của họ cần phải được gửi bằng các phương tiện khác.
Sự đánh đổi này nghe có vẻ tồi tệ hơn nó. Việc bỏ xác nhận tin nhắn và lưu vào bộ đệm dành riêng cho người đăng ký cho phép Redis pub / sub xử lý tin nhắn rất một cách nhanh chóng, và có nhiều hệ thống được hưởng lợi từ việc phân phối thông qua thời tiết hợp lý.
Mở rộng cụm không hiệu quả, hiện tại…
Pub / sub là một giải pháp để mở rộng quy mô, vì vậy điều quan trọng là phải xem xét mở rộng không chỉ tin nhắn của bạn mà còn cả dịch vụ bạn đang sử dụng để gửi tin nhắn. thiết lập dịch vụ nhắn tin.
Redis Cluster (một phần của Redis kể từ phiên bản 3.0) đã hỗ trợ sẵn cho Redis pub / sub, với một lưu ý quan trọng. Mọi thông báo đã xuất bản được phát tới mọi memberof trong một cụm Redis, điều này có thể nhanh chóng khiến các cụm lớn bị quá tải với lưu lượng truy cập.
Câu trả lời ngắn gọn cho điều này là chỉ sử dụng pub / sub trên các máy chủ Redis riêng lẻ hoặc các cụm pub / sub-cụ thể nhỏ - cả hai tùy chọn này đều có thể xử lý một lượng lớn thông báo. Redis Cluster dài hạn hơn sẽ có các tính năng thông minh hơn chỉ định tuyến thư khi cần thiết, nhưng tính năng đó vẫn đang trong giai đoạn thiết kế.
Kết thúc
Nhìn chung Redis pub / sub là một công cụ hữu ích cho phần mềm mở rộng quy mô. Sự vắng mặt của các tính năng mà chúng tôi đã xem xét ở trên là một lỗi chỉ định, dẫn đến sự đơn giản và nhanh chóng cho Redis với chi phí là thuốc chữa bách bệnh cho tất cả các mục đích nhắn tin.
Giống như nhiều phần khác của Redis, nó không được thiết kế riêng cho mọi trường hợp sử dụng chuyên biệt nhưng bạn có thể mất một khoảng thời gian dài với một chút hiểu biết. Được kết hợp với các tính năng khác của Red, nó trở thành một công cụ rất mạnh mẽ trong developer’stoolbelt.
Với phần tổng quan cấp cao đã hoàn thành, bạn có thể đã sẵn sàng xem một số ví dụ về mã phụ / mã. Hãy xem Redis Pub / Sub:Cách tiếp theo.