Всем привет
есть задача: необходимо написать алгоритм имитации сихронного вызова.
Есть система А она синхронно вызывает систему B, система B в свою очередь взаимодействует с разными другими системами (C, D, and so on) асинхронно, но в итоге получив ответы и сформировав результат должна как результат синхронного вызова вернуть результат.
вопрос: может кто имеет описанный алгоритм имитации синхронного вызова по средствам асинхронных. там нужно учитывать такую особенность, что запросов от системы A может быть много, что система B может принимать сообщения и от других систем,по этому для того чтобы связать запрос с ответом необходимо делать CorrelationID для сообщеиния и т.д. может кто имеет алгоритм или знает где лежит ? ну и работающий пример был бы просто счастье
Здравствуйте, Аноним, Вы писали:
А>Всем привет А>есть задача: необходимо написать алгоритм имитации сихронного вызова. А>Есть система А она синхронно вызывает систему 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.
Здравствуйте, Аноним, Вы писали:
А>Приходилось такое делать не раз. А>Я остановился на подходе, в котором для асинхронной работы отводится отдельный тред, который заканчивается как только вся работа по запросу выполнена. Соответственно, в вызывающем потоке остается вызвать join.
При более-менее серьезной нагрузке умрет такой подход.
Здравствуйте, Аноним, Вы писали:
А>Всем привет А>есть задача: необходимо написать алгоритм имитации сихронного вызова. А>Есть система А она синхронно вызывает систему B, система B в свою очередь взаимодействует с разными другими системами (C, D, and so on) асинхронно, но в итоге получив ответы и сформировав результат должна как результат синхронного вызова вернуть результат.
А>вопрос: может кто имеет описанный алгоритм имитации синхронного вызова по средствам асинхронных. там нужно учитывать такую особенность, что запросов от системы A может быть много, что система B может принимать сообщения и от других систем,по этому для того чтобы связать запрос с ответом необходимо делать CorrelationID для сообщеиния и т.д. может кто имеет алгоритм или знает где лежит ? ну и работающий пример был бы просто счастье
А>поделитесь инфой, плиз
Все уже украдено до нас. Любой асинхронный интерфейс содержит способы скореллировать между собой отправку запроса и получение ответа. Иначе оно бы вообще не работало. А в правильных платформах все разнообразие таких способов корелляции сведено в набор классов\интерфейсов.
Разработчику остается только: реализовать state machine, который делает асинхронные вызовы, а на последнем асинхронном ответе выставлять какой-нить event. Код функции будет запускать state machine и ожидать выстреливания event. А если платформа хороша, то там уже, вероятнее всего, есть готовые средства для реализации.