Сервисная архитектура Ruby - как обеспечить синхронизацию? - PullRequest
1 голос
/ 09 марта 2012

Я новичок в написании сервис-ориентированных приложений, поэтому для некоторых это может быть тривиальным вопросом.

Моя текущая настройка выглядит примерно так:

1 - Приложение базовых рельсов. Также содержит маршруты и некоторую логику приложения.
2 - несколько услуг. Я извлек их из моего приложения базовых рельсов. В основном это ресурсы, которые были обширными БД или использовали решение без SQL.

Итак, что я в итоге сделал, это что-то вроде

в моем приложении rails у меня есть контроллер мест, который отвечает на все основные операции CRUD на местах. Внутренне это делает HTTP-вызов сервису мест.

def show
    req = Typhoeus::Request.new('http://127.0.0.1:7439/places/#{params[:id]}.json')
    @places = req.response.body
end

Проблема в том, что если я делаю более 1 вызова службы, то как убедиться, что у меня есть ответ для всех, прежде чем отображать представления? Кроме того, даже при 1 вызове службы, как работает процесс рендеринга Rails? Так, например, если службе требуется много времени для ответа, обрабатывается ли страница или она бесконечно ждет ответа?

1 Ответ

0 голосов
/ 06 июня 2013

Я не могу ответить на ваш вопрос конкретно о Typhoeus, поскольку я никогда не использовал его, но я постараюсь ответить более широко об этой проблеме в SOA, и, надеюсь, это будет полезно.

Общий поток состоит в том, что пользовательский интерфейс должен состоять из множества служб и не допускать вероятность того, что некоторые из этих служб могут быть недоступны или не отвечать.

У вас есть несколько вариантов:

1) Раскройте и сделайте композицию из браузера. Используйте что-то вроде Backbone и отправляйте Ajax-запросы каждому из сервисов. Вы можете сделать многие из этих запросов асинхронно и визуализировать каждую часть страницы, когда они возвращаются - если не возвращается, не отображать эту часть - или сделать так, чтобы Backbone отображал какой-то заполнитель в этом регионе.

2) Если вы хотите создать объект модели в вашем контроллере (как в вашем примере), вы должны как-то обработать тайм-ауты и снова - использовать модель заполнителя для любой службы, которая не отвечает. Хорошая вещь в этом заключается в том, что в зависимости от службы вы можете решить, насколько важно иметь данные и сколько времени вы готовы ждать, прежде чем считать это таймаутом и двигаться дальше.

Взять, к примеру, страницу продукта Amazon. Очень важно узнать подробности о продукте из его сервиса - если вы этого не получите, вероятно, стоит выдать ошибку браузеру. Но если служба «Клиенты, купившие этот продукт, также купили ...» не отвечает, можно просто перестать ждать и отобразить страницу без нее.

Опять же - я не знаю Typhoeus, поэтому я не уверен, как с этим справиться, но, надеюсь, это поможет. Удачи!

...