пятница, 9 октября 2015 г.

[prog.c++] Любопытное про DDS и RxCpp

Посмотрел слайды презентации Reactive Stream Processing Rx4DDS с конференции CppCon 2015. Любопытно.

Тема DDS (т.е. Data Distribution Service for Real-Time Systems) меня давно интересует (материалы на эту тему в блоге можно найти по тегам DDS, Internet-Of-Things и Machine-2-Machine). Интересует отчасти потому, что сам когда-то начинал профессиональную деятельность в лаборатории АСУТП и ИИС. Отчасти потому, что заниматься нонешним мейнстримом в программизме, как то Web и мобильные приложения, очень не хочется по тем или иным причинам.

А вот в направление DDS мог бы вложиться всерьез. Только пока непонятно как.

Можно было бы, конечно, взять парочку OMG-шных стандартов, касающихся DDS, и создать еще одну их имплементацию. Но тут работы вагон и маленькая тележка. Полезный же выхлоп не понятен, т.к. уже есть как платные, так и бесплатные реализации DDS для C++. Немного, но есть. Нужна ли кому-то еще одна? И настолько ли нужна, чтобы отбить вложения? Не понятно совершенно.

Возможно, дело было бы проще, если бы были завязки на конторы, которые производят железо или программно-аппаратные комплексы, в которых DDS (или какой-то из других IIoT-шных стандартов) использовался бы для взаимодействия с внешним миром. Можно было бы попробовать взяться за какие-то связанные с этим задачи. Но таких завязок, к сожалению, нет.

Посему пока плотно DDS не занимаюсь, хотя если что-то по этой теме попадается на глаза, просматриваю с любопытством. Кто знает, вдруг что-то и натолкнет на мысль о том, как подружить SObjectizer с DDS-ом (или чем-то другим из области IIoT). Имхо, для тамошней специфики агенты подходят гораздо больше, чем для решения задач поддержки 10K клиентов на http-сервере.

Вот и вышеозначенная презентация любопытна как раз с этой точки зрения. Подружить DDS-овские потоки данных с идеей реактивных потоков -- это интересно. А вот нужно ли... Далеко не факт, судя по слайдам :) Хотя если поискать примеры обработки данных из DDS-ных data_reader-ов, то можно найти еще более страшные примеры кода :)

А вообще интересно наблюдать за тем, куда катится современное программирование на C++. Пока вот такие примеры кода еще редкость, но не исключено, что подобный декларативный код станет нормой лет через 10-15:

grouped_stream
   .map([](GroupedShapeObservable go) {
         return go >> rx4dds::to_unkeyed()
               >> rx4dds::complete_on_dispose()
               >> rx4dds::error_on_no_alive_writers()
               >> rx4dds::skip_invalid_samples()
               >> rx4dds::map_samples_to_data();
      })
   >> rx4dds::coalesce_alive()
   >> map([](const vector<rxcpp::observable<ShapeType>> & srcs) {
         return rx4dds::combine_latest(srcs);
      })
   >> rxcpp::switch_on_next()
   >> rxcpp::map([](const std::vector<ShapeType> & shapes) {
         return calculate_average(shapes);
      })
   >> rx4dds::publish_over_dds(triangle_writer, ShapeType("ORANGE"));

Комментариев нет: