Không khó để tự mình thực hiện.
Trước hết, bạn cần xác định giao thức sẽ được sử dụng. Nó có thể rất đơn giản; giống như trường loại tin nhắn, trường tải trọng và trọng tải thực tế. Các loại tin nhắn bạn cần SUBSCRIBE
, UNSUBSCRIBE
và PUBLISH
. Tải trọng cho các thông báo SUBSCRIBE
và UNSUBSCRIBE
là tên của kênh đăng ký/hủy đăng ký. Trọng tải cho thông báo PUBLISH
là tên kênh và dữ liệu thực tế (cùng với kích thước của dữ liệu của khóa học).
Để kết nối tất cả người đăng ký, bạn cần một máy chủ trung tâm. Tất cả người đăng ký/nhà xuất bản cần kết nối với máy chủ này. Chương trình máy chủ giữ một tập hợp các hàng đợi, một cho mỗi kênh. Khi thông báo đăng ký hoặc xuất bản đến máy chủ cho kênh không tồn tại, hãy tạo hàng đợi tin nhắn mới cho kênh này. Đối với mỗi kênh, máy chủ cũng cần một bộ sưu tập của tất cả các khách hàng đăng ký kênh đó. Khi thông báo xuất bản đến máy chủ, nó sẽ được thêm vào cuối hàng đợi cho kênh được đề cập. Mặc dù hàng đợi kênh không trống, gửi bản sao của nó cho tất cả người đăng ký kênh đó và khi tất cả đã nhận được thì thư có thể bị xóa khỏi hàng đợi.
Phần cứng của máy chủ có thể sẽ là phần giao tiếp. Phần dễ dàng sẽ được tất cả hàng đợi và bộ sưu tập, như bạn có thể sử dụng C++ standard containers cho tất cả trong số họ (ví dụ std::queue
cho hàng đợi thực tế, std::unordered_map
cho các kênh, và std::vector
cho bộ sưu tập của khách hàng được kết nối.)
Các khách hàng rất đơn giản, tất cả những gì cần làm là có thể gửi đăng ký và xuất bản tin nhắn tới máy chủ và nhận các tin nhắn xuất bản từ máy chủ. Phần cứng một lần nữa sẽ là phần giao tiếp thực tế.
Postscript:
Tôi chưa bao giờ thực sự xây dựng được một hệ thống như vậy tự của tôi, tất cả những điều trên chỉ là trực tiếp của đỉnh đầu của tôi. Một lập trình viên có kinh nghiệm không cần nhiều hơn một vài giờ để thực hiện những điều cơ bản, có thể là một vài ngày cho một người thiếu kinh nghiệm.
Để liên lạc bạn có thể sử dụng, ví dụ: Boost ASIO, có thể sử dụng một threads mỗi kênh. Và bạn có thể sử dụng một cái gì đó như Boost property tree để tạo/phân tích cú pháp JSON hoặc XML thư.
Tuy nhiên, tất cả điều này là loại phát minh lại bánh xe, khi bạn có thể bắt đầu sử dụng một trong những hệ thống hiện có như RabbitMQ trong một vài giờ, tiết kiệm rất nhiều thời gian (và rất nhiều lỗi!)
Bạn có cần sử dụng lib hoặc dịch vụ không? Hoặc bạn có thể, đưa ra các điều kiện tiên quyết, chỉ cần sử dụng ổ cắm hoặc đường ống? Đó sẽ là, có khả năng, hiệu quả hơn cho một quả mâm xôi. –
ZeroMQ rất đơn giản để sử dụng. – Kimi
@ dema80: Tôi thích dịch vụ hơn nhưng lib thì ổn. Bạn có thể đề nghị bất kỳ thực hiện sử dụng ổ cắm? – Yoshi