Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
1

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

22.11.2016, 13:37. Просмотров 710. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2016, 13:37
Ответы с готовыми решениями:

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

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

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

Почему высокий уровень на пине?
<Изображение удалено> Кароч вот код начальной инициализации. Вопрос- почему...

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

34
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
22.11.2016, 13:57 2
Kastaneda, для тех кто не знает что такое AMQP и RPC можно сформулировать или технические особенности этих заклинаний здесь принципиальны? если да, то этого почему-то не видно по примеру
1
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
22.11.2016, 14:03  [ТС] 3
Цитата Сообщение от vxg Посмотреть сообщение
Kastaneda, для тех кто не знает что такое AMQP и RPC можно сформулировать или технические особенности этих заклинаний здесь принципиальны? если да, то этого почему-то не видно по примеру
Технические особенности не принципиальны. Попробую объяснить - AMQP это протокол передачи данных (по сети), используется в качестве транспорта. RPC - это тоже протокол, но более высокого уровня, ему без разницы через какой транспорт к нему пришло сообщение, хоть через HTTP.

Если проводить аналогию, то можно представить, что вместо AMQP имеется ввиду TCP, а вместо RPC - HTTP. И теперь представим, что для отправки HTTP ответа уровень HTTP должен знать о каких-то деталях реализации TCP, понятно, что это не правильно. И у нас получается, что уровень RPC должен знать об AMQP.
0
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
22.11.2016, 14:10 4
Kastaneda
то есть имеем объект 1-го уровня через который проходят данные попадающее объекту 2-го уровня и объекту 2-го уровня нужно знать об этих данных нечто доступное лишь объекту 1-го уровня?
0
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
22.11.2016, 14:14  [ТС] 5
vxg, да и задача в том, чтобы оградить объект 2-го уровня от этих знаний, т.к. чисто теоретически тип объекта 1-го уровня может быть другим и иметь другую реализацию.
0
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
22.11.2016, 14:19 6
Kastaneda, если объект 1-го уровня может вызвать обработчик объекта 2-го уровня во время приема данных (вместо вызова обработчика неким стандартным механизмом) и передать в этом обработчике нужные данные наверное это самое естественное решение кроме кэша
0
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
22.11.2016, 14:24  [ТС] 7
Цитата Сообщение от vxg Посмотреть сообщение
если объект 1-го уровня может вызвать обработчик объекта 2-го уровня во время приема данных (вместо вызова обработчика неким стандартным механизмом) и передать в этом обработчике нужные данные наверное это самое естественное решение кроме кэша
Оно выглядит просто, но оно не правильное. Завтра мы меняем AMQP на тот же HTTP и нам данные AMQP не нужны - придется переписываться код. Или мы хотим использовать 2 вида транспорта одновременно - тогда вообще получится несовместимость.
0
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
22.11.2016, 15:13 8
Kastaneda, если вы владеете структурой данных прикрепляйте нужную информацию нижнего уровня в экстру
0
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
22.11.2016, 16:37  [ТС] 9
vxg, нужно передать 2 поля (в примере в 1-ом посте показал одно просто для примера), но в идеале кол-во полей должно быть любым, поэтому поле extra будет непонятно какого типа (не void* же делать).
Цитата Сообщение от vxg Посмотреть сообщение
если вы владеете структурой
можно варьировать как угодно, пока есть возможность менять интерфейсы/сигнатуры.
0
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
22.11.2016, 16:45 10
Kastaneda, ну так сделать это поле std::list<VARIANT>

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

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

Добавлено через 25 секунд
что бы проверились в CT и можно было спать спокойно
0
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
23.11.2016, 07:38  [ТС] 11
Цитата Сообщение от vxg Посмотреть сообщение
или лучше std::map<std::string, VARIANT> что бы уж с именами)
Была такая идея, но это решение попахивает)
0
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
23.11.2016, 09:02 12
Kastaneda, идеал - это когда вы знаете поля которые вам нужны - тогда экстра это просто структура с вашими полями. Если поля неизвестны и могут меняться то иного способа кроме абстрактного списка логически вроде нет
0
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
23.11.2016, 09:27  [ТС] 13
Цитата Сообщение от vxg Посмотреть сообщение
идеал - это когда вы знаете поля которые вам нужны - тогда экстра это просто структура с вашими полями
Тогда верхний уровень будет знать о деталях реализации нижнего. И, если разработчик наркоман, то он может их даже переписать эти данные на верхнем уровне. Этого хочется избежать.
0
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
23.11.2016, 09:33 14
Kastaneda,
1 верхний уровень хочет знать что то что не дает ему стандартная реализация. для этого мы делаем экстру. если экстра различная для разных реализаций нижнего уровня (что само по себе странно ибо как тогда работает верхний уровень если он не знает какие доп данные ему нужны), то можно на верхнем уровне различать экстры по типам. например экстра TCP или экстра UDP и соответственно по разному с ними работать.
2 если разработчик неадекват, то он может просто не использовать ваши данные. если есть желание защитить сами данные из-за того что они используются еще где-то в цепочке можно возвращать их не в структуре, а в объекте с доступом к полям через get функции.
0
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
23.11.2016, 09:51  [ТС] 15
Цитата Сообщение от vxg Посмотреть сообщение
верхний уровень хочет знать что то что не дает ему стандартная реализация.
В том то и дело, что верхнему уровню это не надо. Теоретически можно на нижнем уровне все кешировать и на верх ничего не отдавать, но кешировать нельзя по ряду причин. Поэтому приходится отдавать это на верх.
0
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
23.11.2016, 12:43 16
Цитата Сообщение от Kastaneda Посмотреть сообщение
В том то и дело, что верхнему уровню это не надо
это даже проще. тогда нижний уровень что ему надо положит в экстру и что надо из нее возьмет
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7051 / 3354 / 454
Регистрация: 04.12.2011
Сообщений: 9,325
Записей в блоге: 5
23.11.2016, 12:58 17
Цитата Сообщение от Kastaneda Посмотреть сообщение
Итак - есть RPC канал, который реагирует на события AMQP сервера (используется событийная модель). Из RPC канала нужно асинхронно ответить на сообщение, для этого AMQP нужны данные, о которых знает только AMQP. Т.е. эти данные нужно прокинуть из AMQP в RPC, и RPC потом должен эти данные вернуть.
Kastaneda, как я понимаю (из сказанного):
-RPC не знает и не изменяет указанные данные, а пропускает их транзитом
-AMQP использует указанные данные как id для идентификации в момент получения ответа собственного состояния на момент отправки сообщения на которое данный ответ получен.
Верно?
1
Kastaneda
Jesus loves me
Эксперт С++
4937 / 3013 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
23.11.2016, 13:15  [ТС] 18
IGPIGP, да, все верно. Грубо говоря AMQP при отправке ответа добавляет в ответ данные, по которым можно понять на какой именно запрос этот ответ. И это детали реализации AMQP.

vxg, получается "кишками наружу")
0
vxg
Модератор
3251 / 2051 / 323
Регистрация: 13.01.2012
Сообщений: 7,944
23.11.2016, 13:24 19
Цитата Сообщение от IGPIGP Посмотреть сообщение
использует указанные данные как id для идентификации в момент получения ответа собственного состояния на момент отправки сообщения на которое данный ответ получен
ооо... *откидывается на спинку кресла и начинает думать*
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7051 / 3354 / 454
Регистрация: 04.12.2011
Сообщений: 9,325
Записей в блоге: 5
23.11.2016, 13:37 20
Цитата Сообщение от vxg Посмотреть сообщение
откидывается на спинку кресла и начинает думать
Андрей Ефимыч?
Цитата Сообщение от Kastaneda Посмотреть сообщение
да, все верно
И как я понимаю, кешировать нельзя из-за того что не на все сообщения могут быть ответы.
Тогда совет vxg, это выход.
Я бы добавил, что стоит проанализировать имеющийся пакет в прямом сообщении. На предмет есть ли там место для "комментария" в виде id.
Важно ещё проанализировать количество различных состояний дифференцируемых на предмет обработки ответа, чтобы понять какой длины поле следует выбрать.
0
23.11.2016, 13:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2016, 13:37

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru