Russian Qt Forum
Ноябрь 22, 2024, 21:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Распределенная система  (Прочитано 7406 раз)
ammaximus
Гость
« : Январь 27, 2015, 13:36 »

Имеется распределенная система. Каждый узел - рабочее место оператора. Связь между узлами осуществляется посредством ЛВС, в этой же сети находится концентратор, который присылает и получает информацию для управления устройствами.


1. Система должна быть масштабируемой по количеству узлов. (Среднее количество узлов 3-5).
2. От системы не требуется никаких грандиозных распределенных вычислений.
3. Входящая информация от устройств должна быть преобработана модулем non-trivial. Ожидается, что такой модуль должен быть только на одном из узлов (назовем это singleton). Несмотря на то, что от устройств приходит все броадкастом, выполнение non-trivial на каждом узле может внести диссонанс, поскольку в этом модуле происходит накопление, а также учитывается порядок поступления.
4. Данные от устройств формируются в массивы данных.
5. Есть auto-control процесс. Он тоже singleton. Он анализирует уже готовые данные и формирует автоматические команды управления (подкрутить температуру и т.п.)
6. На каждом узле есть графический модуль, который отображает данные для оператора и формирует пользовательские команды.
7. В каждый момент времени графика показывает почти все данные массивов, и обновляется по мере поступления данных, скорее всего данные должны быть полностью реплицированы для каждого узла.

Мысли:
1. Систему пишут несколько человек, хотелось бы уменьшить количество людей, занятых синхронизацией, до одного.
2. auto-control модули, графика и non-trivial скорее всего отдельные процессы, работающие через QSharedMemory, чтобы их было легко двигать между узлами.
3. Для процессов система должна быть прозрачна, для объектов с данными - сильно упрощена.

Как бы вы спроектировали эту систему? Как организовать синхронизацию данных?  C++, Qt.
Записан
Bepec
Гость
« Ответ #1 : Январь 27, 2015, 15:42 »

Слишком у вас всё сложно.

На деле разбиваем всё проще.

Концентратор данных (non-trivial)- получает данные с устройств, обрабатывает данные и заносит в БД, при изменении поступлении команд в БД, отправляет их устройствам.

БД - хранит данные об устройствах, массивов данных с них, количестве узлов и командах.
auto-control - анализирует уже готовые данные и формирует автоматические команды управления (заносит их в таблицу в БД).
Клиент - Запрашивает данные с БД, отображает пользователю и позволяет формировать пользовательские команды управления (заносит их в таблицу в БД).


Что тут получаем - монополизируем данные, монополизируем доступ к устройствам. Таким образом всё что идёт к устройствам должно пройти через нашу БД.

Получаем в итоге систему устройства<->контроллер<->бд<->читатели/писатели.

Масштабируемость по клиентам ограничивается лишь выбранной вами СУБД. (200-4000 пользователей)


PS

Мысли:
1. Систему пишут несколько человек, хотелось бы уменьшить количество людей, занятых синхронизацией, до одного.
Синхронизация тут не нужна, ибо имеем БД. Каждый узел не хранит информацию, он её лишь запрашивает.
2. auto-control модули, графика и non-trivial скорее всего отдельные процессы, работающие через QSharedMemory, чтобы их было легко двигать между узлами.
Нормальное решение, вот только нахрена SharedMemory если они могут быть запущены на разных машинах?Непонимающий
3. Для процессов система должна быть прозрачна, для объектов с данными - сильно упрощена.
Этого я вообще не понял. Для каких процессов, что значит прозрачна, что за объекты с данными? Ниччего не понимаю Веселый Система стандартная получается, простая как болт с гайкой.
« Последнее редактирование: Январь 27, 2015, 16:15 от Bepec » Записан
ammaximus
Гость
« Ответ #2 : Январь 27, 2015, 23:31 »

Вариант с БД рассматривал и вот, что меня останавливает:
1. Система что-то вроде мягкого реального времени, сообщения терять не хорошо, отвечать на запросы своевременно. Локальная сеть помимо этой системы используется еще и для других целей, поэтому сеть - узкое место. Если БД на одном узле, то сеть будет перегружена, распределенная БД - не знаю как работает.
2. Некоторые данные будут меняться редко, поэтому их выгодно кешировать, а не делать запросы к БД каждый раз, с другой стороны, у кеша нет возможности получить сигнал об изменении в БД - нужно регулярно делать запросы.
3. Данных очень много, они разнообразны, их проще описать в виде классов, составлять таблицы будет затруднительно.
4. Большинство данных используются "однократно". В понятии классов - это просто синглтоны, в понятиях БД это будет таблица с одной строкой. Т.е. мало ситуаций, когда нужен график температур, обычно просто показывается текущая.

Короче беспокоит скорость и загруженность сети. Боюсь что "общее" решение не подойдет.

Цитировать
Этого я вообще не понял. Для каких процессов, что значит прозрачна, что за объекты с данными?

Это я уже мои мысли по реализации:
1. Все данные, которые нужно синхронизировать представляются в виде объектов, у которых есть интерфейсы.
2. Объекты полностью реплицированы, на каждом узле и у каждого процесса есть полная копия. Если процессы на одном узле, возможно для хранения данных используется QSharedMemory, чтобы не делать лишних копий.
3. Графика и одиночные процессы пользуются интерфейсами объектов, для них распределенная система "прозрачна", т.е. им кажется, что выполняются на одном узле.
4. Внутри объектов реализуется изменение и синхронизация данных.
5. Чтобы каждый объект (а их много) не занимался полностью работой с сетью, должен быть какой-то предок, который упрощает синхронизацию.
6. Поддерживать непротиворечивость реплик предлагается с помощью маркера. Каждый процесс, который хочет внести изменения должен получить маркер. Маркер один на все процессы. После окончания процесс рассылает всем изменения, и отпускает маркер. Передача осуществляется через UDP-сокет, а для процессов, которые располагаются на одном узле, передача может происходить через QSharedMemory или через QLocalSocket, если он не очень будет замедлять.
7. На каждом из узлов одна реплика является главной, она заведует маркером и осуществляет контроль над синхронизацией своих подопечных. (т.е. реплики составляют граф)

Преимущества:
1. Объекты могут отслеживать изменения и испускать qt-сигналы например для графики.
2. По сети передается минимум - сериализованные различия
3. Для локальных процессов активно используется другой транспорт
Записан
Bepec
Гость
« Ответ #3 : Январь 28, 2015, 00:11 »

Ммм... Ладно небольшой урок логики.

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

Взгляните чистым взглядом - где больше будет нагружена сеть?

Ну а по делу.
1) Работа с БД быстрее, чем работа с ЛВС. Узел в сети НЕ БУДЕТ перегружен до тех пор, пока пропускная способность сети позволяет. Т.е. если вы сумеете достигнуть такого момента - у вас ляжет сеть. И если это случится - вам нужно будет однозначно проводить оптоволокно. Ибо запрос к бд даёт мизерную нагрузку.
2) А что мешает возвращать только изменённые данные? Простейшее поле в таблице "время последнего изменения" позволит вам убрать мусор. Ну а если точнее то это проблемы протокола и кеширования. И они никак не связаны с тем, где будет хранится информация. Пусть даже у вас там будет процесс с массивом данных - вам придётся тогда вместо бд запрашивать его. Шило на мыло, только мыло самодельное будет и не тестированное.
3) Это смешно... Таблица проще класса. Да, вы потратите 1 день на описание, но оно того стоит. К тому же видимо вы уже забыли о пункте 1.
4) бред. Заведите таблицу синглтонов и будет у вас всё хорошо.

Возьмите себя в руки и сделайте тестовый примерчик по моей архитектуре. Займёт это у вас ну пару дней. Зато увидите плюсы и минусы. А потом сделайте тестовый примерчик по вашей архитектуре. Займет это у вас нууу неделю, хотя мне кажется в разы больше.


На мой взгляд у вас сейчас фонтанирование идеями. Маркерный цикл поверх TCP протокола это конечно гениально, но бессмысленно. Такой подход был бы уместен на шине данных аля RS232 RS485.

PS если и это не заставит вас задуматься, я опускаю руки. Улыбающийся

PPS ну и извечная истина - клиенту не нужны все массивы данных. Человек не сможет их воспринять. Потому запрашиваться будет только необходимое.
« Последнее редактирование: Январь 28, 2015, 12:46 от Bepec » Записан
ammaximus
Гость
« Ответ #4 : Январь 28, 2015, 08:18 »

Спасибо,  попробую
Цитировать
фонтанирование идеями
Впервые проектирую крупную систему, хочется собрать все грабли
« Последнее редактирование: Январь 28, 2015, 08:28 от ammaximus » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Январь 28, 2015, 09:08 »

1. Попробуйте NoSQL БД - для слабо структурированных данных они замечательно подходят
2. Ну или если взглянуть на это с другой стороны - система похожа на распределенную очередь. Гляньте на ZMQ.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #6 : Январь 28, 2015, 10:11 »

а бы на место "агрегатор" поставил субд + свой сервер
клиенты подключаются к "агрегатор" за данными и командами
Записан
ammaximus
Гость
« Ответ #7 : Январь 28, 2015, 13:01 »

Разбираю систему Вереса, возникло пару вопросов:
1. Как в данном случае можно получить сигнал об изменении. Т.е. если один из auto-control сгенерирует ошибку, ее тут же нужно высветить на экранах всех пользователей. Здесь придется заводить таблицу ошибок и опрашивать ее каждые 200мс? А если не через БД, то здесь возникает необходимость в дополнительном механизме типа MPI. Что-то типа CORBA, есть RMI, а есть и просто invoke событий.
2. Не планировалось заводить отдельный узел под сервер - это повысит стоимость системы. Поэтому сервер БД может быть только на одном из узлов пользователя. Пользователь может выключить узел или произойдет отказ и система не сможет работать.

Цитировать
а бы на место "агрегатор" поставил субд + свой сервер
Агрегатор - простенький блок с QNX, который умеет работать с устройствами + смотри 2.

ZeroMQ - очень интересная либа, спасибо, читаю.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #8 : Январь 28, 2015, 13:37 »

А если не через БД, то здесь возникает необходимость в дополнительном механизме типа MPI. Что-то типа CORBA, есть RMI, а есть и просто invoke событий.
И вновь к вопросу ZMQ. Там есть подписка на события.
Записан
Bepec
Гость
« Ответ #9 : Январь 28, 2015, 14:06 »

1. А это уже вопрос архитектуры общения с БД. Можно как создать отдельный узел, что будет находиться на машине с БД и рассылать уведомления об изменении. А может и подписаться на нотификацию бд. Как вам угодно.
2. Т.е. вы хотите взаимозаменяемости узлов? тогда ставьте полны комплект узлов на каждый компьютер. И будет вам счастье. И другого выхода у вас нет. А как уж они будут определять кто будет главный - это вы уже придумайте сами. Опять же вопрос архитектуры.

Записан
nwnclv
Гость
« Ответ #10 : Февраль 24, 2015, 21:32 »

Имеется распределенная система. ....

ух ты. Очень похоже на мою схему =)) Весь топик не почитал, потому что лениво. Но у меня все на RPC построено. Есть сущность service, которая состоит из вызовов, есть конфиг, который указывает откуда брать какой сервис....хм. собственно все. А БД, не БД ... это  просто средство.

Кстати у меня тоже датчики. и тоже коллекторы и тоже узлы обработки и, наконец, финальный дата центр.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 23.