Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2

Задача дизайна - прокинуть детали низкоуровневой реализации на более высокий уровень и вернуть обратно

22.11.2016, 13:37. Показов 1924. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!

Задача возникла на работе. Мозговым штурмом было предложено 100500 реализаций, одно из них выбрали, но хотелось бы посмотреть на альтернативные варианты

Итак - есть RPC канал, который реагирует на события AMQP сервера (используется событийная модель). Из RPC канала нужно асинхронно ответить на сообщение, для этого AMQP нужны данные, о которых знает только AMQP. Т.е. эти данные нужно прокинуть из AMQP в RPC, и RPC потом должен эти данные вернуть. Чтоб все было кошерно нужно:
1. Чтобы RPC не знал об AMQP (транспорт должен быть заменяемым)
2. Не нужно заставлять пользователя (т.е. RPC) что-то куда-то прокидывать

Чтоб было понятней (очень упращенный вариант)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// AMQP
void AmqpServer::mainLoop()
{
    // что-то делаем, в итоге получаем сообщение
   // при этом есть некий ID, который нужно знать при отправке ответа
   
    _messageHandler->onMessageReceived(message/*, также нужно как-то прокинуть упомянутый ID*/);
}
 
void AmqpServer::sendResponse (std::string response, /* и еще нужно знать упомянутый выше ID*/)
{
    // отправляем сообщение, используя ID
}
 
// RPC
void RpcChannel::onMessageReceived (std::string message/*, нужен еще ID*/)
{
    // обработали сообщение, сформировали ответ
 
    _responseHandler->sendResponse(response/*, плюс нужно вернуть ID*/);
}
Вариант с кешированием IDшников на стороне сервера сразу отметаем по ряду причин. Есть предложения?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2016, 13:37
Ответы с готовыми решениями:

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

Ежедекадно в течение июня измерялся уровень воды в десяти речках. Определить подекадно: в каких речках наблюдался самый высокий уровень
Ежедекадно в течение июня измерялся уровень воды в десяти речках. Определить подекадно: в каких речках наблюдался самый высокий уровень (и...

Высокий уровень
Используя пять вариантов наборов карт 1)«6», «7», «8» 2)«7», «8», «9» 3) «6», «9», «10» 4)«6», «9», «8» 5)«7», «6», «10», сыграйте с...

34
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
22.11.2016, 13:57
Kastaneda, для тех кто не знает что такое AMQP и RPC можно сформулировать или технические особенности этих заклинаний здесь принципиальны? если да, то этого почему-то не видно по примеру
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
22.11.2016, 14:03  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
Kastaneda, для тех кто не знает что такое AMQP и RPC можно сформулировать или технические особенности этих заклинаний здесь принципиальны? если да, то этого почему-то не видно по примеру
Технические особенности не принципиальны. Попробую объяснить - AMQP это протокол передачи данных (по сети), используется в качестве транспорта. RPC - это тоже протокол, но более высокого уровня, ему без разницы через какой транспорт к нему пришло сообщение, хоть через HTTP.

Если проводить аналогию, то можно представить, что вместо AMQP имеется ввиду TCP, а вместо RPC - HTTP. И теперь представим, что для отправки HTTP ответа уровень HTTP должен знать о каких-то деталях реализации TCP, понятно, что это не правильно. И у нас получается, что уровень RPC должен знать об AMQP.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
22.11.2016, 14:10
Kastaneda
то есть имеем объект 1-го уровня через который проходят данные попадающее объекту 2-го уровня и объекту 2-го уровня нужно знать об этих данных нечто доступное лишь объекту 1-го уровня?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
22.11.2016, 14:14  [ТС]
vxg, да и задача в том, чтобы оградить объект 2-го уровня от этих знаний, т.к. чисто теоретически тип объекта 1-го уровня может быть другим и иметь другую реализацию.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
22.11.2016, 14:19
Kastaneda, если объект 1-го уровня может вызвать обработчик объекта 2-го уровня во время приема данных (вместо вызова обработчика неким стандартным механизмом) и передать в этом обработчике нужные данные наверное это самое естественное решение кроме кэша
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
22.11.2016, 14:24  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
если объект 1-го уровня может вызвать обработчик объекта 2-го уровня во время приема данных (вместо вызова обработчика неким стандартным механизмом) и передать в этом обработчике нужные данные наверное это самое естественное решение кроме кэша
Оно выглядит просто, но оно не правильное. Завтра мы меняем AMQP на тот же HTTP и нам данные AMQP не нужны - придется переписываться код. Или мы хотим использовать 2 вида транспорта одновременно - тогда вообще получится несовместимость.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
22.11.2016, 15:13
Kastaneda, если вы владеете структурой данных прикрепляйте нужную информацию нижнего уровня в экстру
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
22.11.2016, 16:37  [ТС]
vxg, нужно передать 2 поля (в примере в 1-ом посте показал одно просто для примера), но в идеале кол-во полей должно быть любым, поэтому поле extra будет непонятно какого типа (не void* же делать).
Цитата Сообщение от vxg Посмотреть сообщение
если вы владеете структурой
можно варьировать как угодно, пока есть возможность менять интерфейсы/сигнатуры.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
22.11.2016, 16:45
Kastaneda, ну так сделать это поле std::list<VARIANT>

Добавлено через 38 секунд
или лучше std::map<std::string, VARIANT> что бы уж с именами)

Добавлено через 2 минуты
хотя с именами не айс, нужны цифровые идентификаторы)

Добавлено через 25 секунд
что бы проверились в CT и можно было спать спокойно
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
23.11.2016, 07:38  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
или лучше std::map<std::string, VARIANT> что бы уж с именами)
Была такая идея, но это решение попахивает)
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
23.11.2016, 09:02
Kastaneda, идеал - это когда вы знаете поля которые вам нужны - тогда экстра это просто структура с вашими полями. Если поля неизвестны и могут меняться то иного способа кроме абстрактного списка логически вроде нет
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
23.11.2016, 09:27  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
идеал - это когда вы знаете поля которые вам нужны - тогда экстра это просто структура с вашими полями
Тогда верхний уровень будет знать о деталях реализации нижнего. И, если разработчик наркоман, то он может их даже переписать эти данные на верхнем уровне. Этого хочется избежать.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
23.11.2016, 09:33
Kastaneda,
1 верхний уровень хочет знать что то что не дает ему стандартная реализация. для этого мы делаем экстру. если экстра различная для разных реализаций нижнего уровня (что само по себе странно ибо как тогда работает верхний уровень если он не знает какие доп данные ему нужны), то можно на верхнем уровне различать экстры по типам. например экстра TCP или экстра UDP и соответственно по разному с ними работать.
2 если разработчик неадекват, то он может просто не использовать ваши данные. если есть желание защитить сами данные из-за того что они используются еще где-то в цепочке можно возвращать их не в структуре, а в объекте с доступом к полям через get функции.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
23.11.2016, 09:51  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
верхний уровень хочет знать что то что не дает ему стандартная реализация.
В том то и дело, что верхнему уровню это не надо. Теоретически можно на нижнем уровне все кешировать и на верх ничего не отдавать, но кешировать нельзя по ряду причин. Поэтому приходится отдавать это на верх.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
23.11.2016, 12:43
Цитата Сообщение от Kastaneda Посмотреть сообщение
В том то и дело, что верхнему уровню это не надо
это даже проще. тогда нижний уровень что ему надо положит в экстру и что надо из нее возьмет
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.11.2016, 12:58
Цитата Сообщение от Kastaneda Посмотреть сообщение
Итак - есть RPC канал, который реагирует на события AMQP сервера (используется событийная модель). Из RPC канала нужно асинхронно ответить на сообщение, для этого AMQP нужны данные, о которых знает только AMQP. Т.е. эти данные нужно прокинуть из AMQP в RPC, и RPC потом должен эти данные вернуть.
Kastaneda, как я понимаю (из сказанного):
-RPC не знает и не изменяет указанные данные, а пропускает их транзитом
-AMQP использует указанные данные как id для идентификации в момент получения ответа собственного состояния на момент отправки сообщения на которое данный ответ получен.
Верно?
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
23.11.2016, 13:15  [ТС]
IGPIGP, да, все верно. Грубо говоря AMQP при отправке ответа добавляет в ответ данные, по которым можно понять на какой именно запрос этот ответ. И это детали реализации AMQP.

vxg, получается "кишками наружу")
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
23.11.2016, 13:24
Цитата Сообщение от IGPIGP Посмотреть сообщение
использует указанные данные как id для идентификации в момент получения ответа собственного состояния на момент отправки сообщения на которое данный ответ получен
ооо... *откидывается на спинку кресла и начинает думать*
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.11.2016, 13:37
Цитата Сообщение от vxg Посмотреть сообщение
откидывается на спинку кресла и начинает думать
Андрей Ефимыч?
Цитата Сообщение от Kastaneda Посмотреть сообщение
да, все верно
И как я понимаю, кешировать нельзя из-за того что не на все сообщения могут быть ответы.
Тогда совет vxg, это выход.
Я бы добавил, что стоит проанализировать имеющийся пакет в прямом сообщении. На предмет есть ли там место для "комментария" в виде id.
Важно ещё проанализировать количество различных состояний дифференцируемых на предмет обработки ответа, чтобы понять какой длины поле следует выбрать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2016, 13:37
Помогаю со студенческими работами здесь

Высокий уровень шума
Здравствуйте, являюсь владельцем данной модели https://www.citilink.ru/catalog/mobile/notebooks/1065383/ Ноутбук по большей части стоит...

Почему высокий уровень на пине?
&lt;Изображение удалено&gt; Кароч вот код начальной инициализации. Вопрос- почему пин РА0 находиться в высоком состоянии??? как будто он пулл...

Реагирование программы на высокий уровень шума
Хочу сделать мини утилиту сидящая в трее и которая бы оповещала, звуком или просто надписью когда превышен определённый уровень шума. Может...

Высокий уровень доверия клиент-сервер
Допустим, есть недобросовестный клиент, который имеет доступ к необфускаторенной версии клиента. Как организовать пересылку небольшой серии...

Работа со звуком более или менее низкий уровень. Получить уровень сигнала микрофона
Доброго дня или ночи. Вобщем товарищи дело такое. предо мной стоит задача определять уровень шума с помощью микрофона на звуковой катре,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru