2010-03-09 2 views
1

Представьте себе какое-то банковское приложение с экраном для создания учетных записей. Каждый счета имеет Валюта и Банк как собственность, валюты будучи отдельный класс, а также Bank. Код может выглядеть примерно так:Ограничить количество вызовов службы в приложении RESTful

public class Account 
{ 
    public Currency Currency { get; set; } 
    public Bank Bank { get; set; } 
} 

public class Currency 
{ 
    public string Code { get; set; } 
    public string Name { get; set; } 
} 

public class Bank 
{ 
    public string Name { get; set; } 
    public string Country { get; set; } 
} 

В соответствии с принципами дизайна REST, каждый ресурс в приложении должен иметь свою собственную службу, и каждый сервис должен иметь методы, которые сопоставляют хорошо к HTTP глаголов. Таким образом, в нашем случае у нас есть AccountService, CurrencyService и BankService.

На экране для создания учетной записи у нас есть некоторый пользовательский интерфейс, чтобы выбрать банк из списка банков и выбрать валюту из списка валют. Представьте, что это веб-приложение, и эти списки являются выпадающими списками. Это означает, что один раскрывающийся список заполняется из CurrencyService и один из BankService. Это означает, что когда мы открываем экран для создания учетной записи, нам нужно сделать два вызова службы двум различным сервисам. Если этот экран сам по себе не на странице, может быть больше вызовов услуг с той же страницы, что влияет на производительность. Это нормально в таком приложении? Если нет, как его можно избежать? Как можно изменить дизайн, не выходя из REST?

ответ

2

Это архитектурное решение, которое вы должны опираться на размер и сложность системы. Чем крупнее и сложнее ваша система, тем больше она может выиграть от увеличения уровней разделения/инкапсуляции (например, вы можете обнаружить, что BankService необходимо масштабировать более агрессивно, чем CurrencyService, и выполнение этих сервисов по отдельности позволит вам сделать это).

Что я хотел бы указать в ответ на ваш вопрос, так это то, что вы должны рассматривать кэширование результатов этих служебных вызовов и повторного использования результата вместо повторного вызова службы для каждой загрузки страницы. Если (как предполагают имена), результат CurrencyService и BankService вряд ли изменится очень часто, вы можете кэшировать их в течение минут или часов за раз и не должны повторно выполнять эти вызовы.

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

+0

Да, вы правы. Кэширование на клиенте решит это. Но как концепция, архитектурный стиль не зависит от кеширования и до сих пор имеет это практическое ограничение. Мне было интересно, было ли изменение дизайна, которое могло бы решить проблему. – Slavo

+0

Если вы строго RESTful, то у банка и валюты должны быть разные URI, так как они разные. Но вам нечего остановить создание службы (только для чтения), которая могла бы вернуть оба списка в качестве одного объекта. Тем не менее, вы окажетесь нуждаться в таких сервисах для каждого другого экрана, и ваш дизайн пострадает. В конечном счете, крошечные накладные расходы - это стоимость хорошо инкапсулированной архитектуры REST (так же, как вы платите крошечный перфоманс для нескольких DLL против мамонта .exe или для вызовов методов против встроенного кода). Это не должно вызывать наибольшей обеспокоенности в плане производительности. :-) –

+0

Хорошо, я думаю, это лучшее, что я получу. Благодаря :). верхний предел достигнут, завтра. – Slavo

2

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

Это один из негативов подхода REST - в основном, если вы имеете дело с объектными запросами, и вам нужны списки объектов x, то у вас есть x вызовов. Точка.

Что означает, что дизайн REST имеет ограниченный коэффициент масштабирования на этом уровне.

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

+0

Как я могу реализовать службу, которая возвращает несколько наборов результатов (зная, что это не RESTful)? Если я использую JSON, каков будет ответ и как я могу обработать его на клиенте? – Slavo

+0

Извините, но неправильно неправильно, что вам нужно сделать N вызовов, чтобы получить список из N элементов. Если вам требуется специализированный просмотр в вашем приложении по каким-либо причинам (например, полный список предметов в одном представлении), просто определите ресурс, который имеет соответствующую семантику. TomTom, пожалуйста, не делайте утверждений о REST, которые не соответствуют действительности. –

+0

@Jan, это не N вызовов для N элементов. Это скорее N вызовов для M элементов, где N - количество ресурсов, в которых вам нужен список, M - количество элементов в списке. – Slavo

1

Hang on, ReST - это представление ресурсов.

Я не думаю, что вы должны быть слишком строги на следующем:

В соответствии с принципами дизайна REST, каждый ресурс в приложении должен иметь свою собственную службу, и каждый сервис должен иметь методы, отображающие хорошо для HTTP-глаголов.

Должно быть прекрасно, что ресурс, представляемый вами в браузере, является «формой» и содержит всю необходимую информацию.

Просто подумайте о правильной степени абстракции при определении вашей структуры URL.

+0

В некоторых не связанных случаях мне также нужны отдельные вызовы для отдельных объектов (т. Е. Только список банков), поэтому я не могу принять форму в качестве ресурса. Или, по крайней мере, это было бы очень громоздким и грязным. – Slavo

+1

Предложите вам взглянуть на некоторые старинные Джо Грегорио: http://www.xml.com/pub/at/34 –

+0

«Просто подумайте о правильной степени абстракции», просто гвозди его. Хотя я бы сказал «при определении ваших ресурсов», а не «Структура URL». –

0

славяно,

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

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

(см http://www.nordsc.com/blog/?p=152)

Пример:


GET /service/account-management 

200 Ok 
Content-Type: application/vnd.my.accounting 
<page> 
... 
<banklist href="http://other.org/service/banklist" type="application/atom+xml" /> 
<currencylist href="http://standard.org/currencies" type="application/rss+xml" /> 
... 
</page> 

на запросы к югу до banklist и currencylist должны обслуживаться из личного кэша клиента в большинстве случаев.

Jan

+0

Редактирование/вставка банков и валют не происходит в одном и том же представлении, поэтому это не имеет значения. Насколько я понимаю, вы говорите, что для моего ресурса это нормально, а ответ службы - список валют и список банков. Если это так, возникает вопрос, как мне возвращать несколько наборов результатов, как я спросил в комментарии к ответу TomTom. – Slavo

+0

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