Есть ли рекомендуемые облегченные услуги / библиотека pubsub?

Я строю небольшую систему, которая содержит много частей, и я хочу использовать сообщение Паб / суб Сервис для общения между частями.

Я читал о некоторых службах очереди сообщений, таких как RabbitMQ и ZeroMQ, но я чувствую, что они слишком сложны и чувствую, что они созданы для распределенной системы. Все части моей системы будут написаны на C ++ / Linux и размещены на небольшом процессоре Raspberry Pi, поэтому мне не нужны такие функции, как масштабируемые, кроссплатформенные, другие языковые клиенты …

Ребята, можете ли вы дать мне несколько советов об услугах или библиотеках, которые соответствуют моим потребностям?

12

Решение

Это не так сложно сделать на самом деле.

Прежде всего вам необходимо определить протокол, который будет использоваться. Это может быть очень просто; как просто поле типа сообщения, поле размера полезной нагрузки и фактическая полезная нагрузка. Типы сообщений, которые вам нужны SUBSCRIBE, UNSUBSCRIBE а также PUBLISH, Полезная нагрузка для SUBSCRIBE а также UNSUBSCRIBE messages — это название канала, на который можно подписаться или отказаться от подписки. Полезная нагрузка для PUBLISH сообщение — это название канала и фактические данные (вместе с размером данных, конечно).

Для подключения всех абонентов необходим центральный сервер. Все подписчики / издатели должны подключиться к этому серверу. Программа сервера хранит коллекцию очередей, по одной для каждого канала. Когда сообщение подписки или публикации поступает на сервер для несуществующего канала, создайте новую очередь сообщений для этого канала. Для каждого канала серверу также нужна коллекция всех клиентов, подписанных на этот канал. Когда на сервер поступает сообщение публикации, оно добавляется в конец очереди для рассматриваемого канала. Пока очередь канала не пуста, отправьте ее копию всем подписчикам этого канала, и когда все ее получат, сообщение можно будет удалить из очереди.

Трудная часть сервера, вероятно, будет коммуникационной частью. Легкой частью будут все очереди и коллекции, так как вы можете использовать C ++ стандартные контейнеры для всех них (например, std::queue для фактической очереди, std::unordered_map для каналов и std::vector для сбора подключенных клиентов.)

Клиенты очень просты, все, что нужно сделать, — это возможность отправлять подписку и публиковать сообщения на сервере, а также получать сообщения публикации с сервера. Тяжелая часть снова станет настоящей коммуникационной частью.


Постскриптум:

На самом деле я никогда не создавал такую ​​систему, все вышеперечисленное было прямо из головы. Опытному программисту не нужно больше пары часов, чтобы реализовать основы, а может и пару дней для неопытного.

Для общения вы можете использовать, например, Boost ASIO, может использовать один потоки на канал. И вы можете использовать что-то вроде Повысить дерево свойств построить / разобрать JSON или же XML Сообщения.

Тем не менее, все это как бы заново изобретает колесо, когда вы, возможно, сможете начать использовать одну из существующих систем, таких как RabbitMQ, через пару часов, сэкономив вам много времени (и много ошибок!)

8

Другие решения

Что касается легких серверов, Redis поддерживает команды pub / sub.

Сам по себе код Redis очень трудный (всего пара файлов), он однопоточный (использует цикл обработки событий) и потребление памяти довольно низкое (по сравнению с другими системами очередей, которые я видел).

5

Я знаю, что уже поздно, но может быть полезно для других. Я реализовал базовый pub / sub на C ++, используя boost.

CppPubSub

Использование очень просто. С одного конца опубликуйте свои данные (общую карту) на канале, а с другой стороны подпишитесь на тот же канал и снова получите общую карту.

// you should create a singleton object of NotificationService class, make it accessible throughout your application.
INotificationService* pNotificationService = new NotificationService();

// Subscribe for the event.
function<NotificationHandler> fnNotificationHandler = bind(&SubscriberClass::NotificationHandlerFunction, this, std::placeholders::_1);
subscriptionToken = pNotificationService->Subscribe("TEST_CHANEL", fnNotificationHandler);

// Publish event
NotificationData _data;
_data["data1"] = "Hello";
_data["data2"] = "World";
pNotificationService->Publish("TEST_CHANEL", _data);

// Unsubscribe event.
pNotificationService->Unsubscribe(subscriptionToken);
3
По вопросам рекламы [email protected]