Из такого предварительного описания сложно понять, какие именно подсказки вам нужны. Поэтому пока ограничусь несколькими общими словами. А вы можете задавать любые дополнительные вопросы, постараюсь на них оперативно отвечать. Если нужно будет обсудить какие-то вещи, которые нежелательно выносить на всеобщее обозрение, то можно написать мне напрямую на eao197 на гмайле.
Общее ощущение от того, что вы описали таково, что подобная задача должна отлично ложиться как на агентов с асинхронными сообщениями вообще, так и на SObjectizer в частности. Т.к. в SObjectizer-е вы сможете гибко распределять своих агентов по рабочим контекстам с помощью диспетчеров. Скажем, агентов, которые должны на отдельных рабочих нитях опрашивать оборудование можно привязать к отдельным экземплярам one_thread-диспетчеров, либо же к одному общему active_obj-диспетчеру (который каждому агенту автоматически будет выделять отдельную нить). А агентов, которые делают какую-то обработку данных можно разместить на общем thread_pool-диспетчере (или adv_thread_pool-диспетчере). Ну и распространять информацию между агентами вы сможете как в режиме 1-к-1, так и 1-ко-многим.
Что касается типов сообщений, то их в SObjectizer как раз немного. Всего два:
* собственно сообщения с некими данными внутри. Эти сообщения могут быть как отнаследованными от so_5::message_t, так и не отнаследованными (отсылка отнаследованных сообщений может быть несколько эффективнее). Но, в общем, это дело вкуса, а так же возможностей отрефакторить уже имеющийся у вас код;
* сигналы, которые информацию внутри хранить не могут и которые нужны лишь для информирования о том, что какой-то сигнал возник. Вот сигналы должны наследоваться от so_5::signal_t.
Возможно, вы уже читали эти статьи, но на всякий случай дам ссылки. Думаю, они могут быть для вас полезны:
https://habr.com/ru/post/460123/ "A declarative data-processing pipeline on top of actors? Why not?" Эта статья может быть слишком хардкорной, т.к. там навороченные C++ные возможности используются, но в ней рассказывается о том, как можно сделать стадийность обработки информации. И если компактный DSL для описания конвейера обработки данных не нужен, то можно его сделать на агентах без дополнительной шаблонной магии.