Имитация синхронного вызова
От: Аноним  
Дата: 04.07.11 10:35
Оценка:
Всем привет
есть задача: необходимо написать алгоритм имитации сихронного вызова.
Есть система А она синхронно вызывает систему B, система B в свою очередь взаимодействует с разными другими системами (C, D, and so on) асинхронно, но в итоге получив ответы и сформировав результат должна как результат синхронного вызова вернуть результат.

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

поделитесь инфой, плиз
Re: Имитация синхронного вызова
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.07.11 10:42
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Всем привет

А>есть задача: необходимо написать алгоритм имитации сихронного вызова.
А>Есть система А она синхронно вызывает систему B, система B в свою очередь взаимодействует с разными другими системами (C, D, and so on) асинхронно, но в итоге получив ответы и сформировав результат должна как результат синхронного вызова вернуть результат.

И в чём проблема-то? Таких реализаций дофига, начиная с DNS рекурсора, которых у каждого провайдера K штук.
Получил запрос, запомнил, пошёл отрабатывать, закончил — послал ответ.
Никакого особого "алгоритма" тут в принципе нет.

А>вопрос: может кто имеет описанный алгоритм имитации синхронного вызова по средствам асинхронных. там нужно учитывать такую особенность, что запросов от системы A может быть много, что система B может принимать сообщения и от других систем,по этому для того чтобы связать запрос с ответом необходимо делать CorrelationID для сообщеиния и т.д. может кто имеет алгоритм или знает где лежит ? ну и работающий пример был бы просто счастье :)


Если запрос от A таки синхронный, это значит, что A ждёт (по крайней мере по данному каналу связи) ответ прежде чем послать следующий запрос. Тогда никакого CorrelationID не нужно, он соответствует каналу связи.
А вот если можно послать один запрос, второй, третий и т.д., то их нужно как-то обозначать. Как правило, это называют Tag, а не CorrelationID, хотя суть та же. И опять-таки понятие "алгоритм" здесь слабо применимо, это вопрос структуры построения системы.

А>поделитесь инфой, плиз :)


Ну вот поделился. Ещё есть вопросы?
The God is real, unless declared integer.
Re: Имитация синхронного вызова
От: Аноним  
Дата: 04.07.11 14:38
Оценка:
Приходилось такое делать не раз.
Я остановился на подходе, в котором для асинхронной работы отводится отдельный тред, который заканчивается как только вся работа по запросу выполнена. Соответственно, в вызывающем потоке остается вызвать join.
Re[2]: Имитация синхронного вызова
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.07.11 10:20
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Приходилось такое делать не раз.

А>Я остановился на подходе, в котором для асинхронной работы отводится отдельный тред, который заканчивается как только вся работа по запросу выполнена. Соответственно, в вызывающем потоке остается вызвать join.

При более-менее серьезной нагрузке умрет такой подход.
Re: Имитация синхронного вызова
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.07.11 10:33
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Всем привет

А>есть задача: необходимо написать алгоритм имитации сихронного вызова.
А>Есть система А она синхронно вызывает систему B, система B в свою очередь взаимодействует с разными другими системами (C, D, and so on) асинхронно, но в итоге получив ответы и сформировав результат должна как результат синхронного вызова вернуть результат.

А>вопрос: может кто имеет описанный алгоритм имитации синхронного вызова по средствам асинхронных. там нужно учитывать такую особенность, что запросов от системы A может быть много, что система B может принимать сообщения и от других систем,по этому для того чтобы связать запрос с ответом необходимо делать CorrelationID для сообщеиния и т.д. может кто имеет алгоритм или знает где лежит ? ну и работающий пример был бы просто счастье


А>поделитесь инфой, плиз


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

Разработчику остается только: реализовать state machine, который делает асинхронные вызовы, а на последнем асинхронном ответе выставлять какой-нить event. Код функции будет запускать state machine и ожидать выстреливания event. А если платформа хороша, то там уже, вероятнее всего, есть готовые средства для реализации.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.