2009-06-24 3 views
0

Я пишу клиент/серверное приложение, которое опубликует и подписаться на темы. У меня мало вопросов об архитектуре и реализации этого проекта.Написание темы pub/sub system

Прежде всего, чтобы настроить базу, я буду использовать C# (.NET 3.5), и я хочу явно использовать raw Sockets/AIO/Threads (сначала нет WCF, поскольку я хочу точно настроить сервер и клиентов на мои потребности) , Клиенты в основном подписываются на темы, но могут иногда отправлять команду на сервер и даже публиковать данные. Некоторые клиенты могут быть только издателями.

  1. Как вы думаете, должны быть основные строительные блоки моего сервера ( нитей на клиента, IOCP, ....).

  2. Если клиент использовать один и тот же NetworkStream слушать подписался темы и отправить команду/опубликовать сервер? Как дождаться данных и в то же время записать данные в поток , должно ли это быть сделано в той же теме?

(пример код будет понятно :))

+0

Зачем изобретать колесо? Почему бы не использовать MSMQ ('System.Messaging')? Или что-то вроде [CodeMesh] (http://www.codemesh.com/products/jmscourier/examples/topic_pub_cs.html)? Не нужно троллить ... Только причина, по которой я спрашиваю, это проблемное пространство, хорошо изученное через множество продуктов, и есть много сложных проблем, которые решаются для вашего OOTB с помощью этого подхода. – cwash

+0

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

ответ

0
  1. Я хотел бы использовать асинхронные розетки как можно больше, как это устранит необходимость для вас, чтобы управлять своим собственным пулом потоков для обработки запроса.

  2. Клиент должен использовать два потока - один для перечисления и другой для отправки. Это значительно упростит работу как на стороне клиента, так и на стороне сервера. Опять же, используйте асинхронные сокеты, чтобы избежать необходимости управлять несколькими потоками.

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

0

Вы проверили ActiveMQ? Я считаю, что это уже темы, и C# имеет возможность поговорить с ним через свой NMS API.

+0

Да, он уже предоставляет такую ​​услугу, но я хотел бы узнать больше и понять внутреннюю написание эффективного и масштабируемого сетевого сервера. – Dave

Смежные вопросы