Нам нужно создать программную среду (или промежуточное ПО), которая позволит обмениваться сообщениями между различными программными компонентами (или модулями), работающими на одной машине. Этот фреймворк предоставит такие возможности:
- Связь между модулями осуществляется через «обмен сообщениями».
- Каждый модуль будет иметь свою собственную очередь сообщений и поток обработчика сообщений, который будет синхронно обрабатывать каждое входящее сообщение.
С учетом вышеизложенных требований, какой из следующих подходов является правильным (с его аргументацией)?:
- Реализация модулей в виде процессов и обмен сообщениями через разделяемую память
- Реализация модулей в виде потоков в одном процессе и обмен сообщениями путем помещения объектов сообщений в очередь сообщений целевого модуля.
Из источника, есть некоторые очевидные минусы и плюсы:
- В варианте 2, если один модуль вызывает ошибку сегментации, процесс (таким образом, все приложение) аварийно завершает работу. И один модуль может напрямую обращаться/изменять память другого модуля, что может привести к трудным для отладки ошибкам времени выполнения.
- Но с Вариантом-1 вам нужно позаботиться о состояниях, когда модуль, с которым вам нужно связаться, только что вышел из строя. Если в программном обеспечении есть N модулей, может быть 2 ^ N многих рабочих / аварийных состояний системы, которые влияют на алгоритмы, работающие в модулях.
- Опять же, в варианте 1 отправитель не может предполагать, что получатель получил сообщение, потому что в этот момент могло произойти сбой. (Но система может оповестить все модули о сбое конкретного модуля; таким образом, отправитель может сделать вывод, что получатель не сможет обработать сообщение, даже если он успешно его получил)
Я за вариант-2, но не уверен, достаточно ли убедительны мои аргументы. Каковы ваши мнения?
РЕДАКТИРОВАТЬ: По запросам на разъяснение, вот более подробная информация о спецификации:
- Это встроенное приложение, которое будет работать в ОС Linux.
- К сожалению, я не могу рассказать о самом проекте, но могу сказать, что компонентов проекта несколько, каждый компонент будет разрабатываться своей командой (из 3-4 человек), и решено, что коммуникация между этими компоненты/модули через какую-то структуру обмена сообщениями.
- В качестве языка программирования будет использоваться C/C++.
- Что «API интерфейса модуля» автоматически предоставит разработчикам модуля: (1) цикл обработки сообщений/событий, (2) синхронную очередь сообщений, (3) переменную-член указателя функции, где вы можете установить свой функция обработки сообщений.