связанные с обменом сообщениями. Основное, на что требуется обратить внимание: сервисы
взаимодействуют посредством обмена сообщениями, как правило, по сети, что по сути своей
медленнее, чем прямое взаимодействие внутри процесса, и обычно сервисы взаимодействуют
с потребителями асинхронно. Кроме того, сообщения, передаваемые между сервисом и
потребителем, могут быть маршрутизированы, изменены, доставлены в порядке, отличном от
порядка, в котором они отправлялись, или даже утрачены, если не реализован механизм
гарантированной доставки. Все эти аспекты требуют создания дизайна, в котором будет учтено
такое недетерминированное поведение процесса обмена сообщениями. При проектировании
слоя сервисов руководствуйтесь следующими рекомендациями:
Проектируйте сервисы, областью действия которых является приложение, а не
компонент. Операции сервисов должны охватывать большие фрагменты
функциональности и сосредотачиваться на операциях приложения.
Проектирование слишком узконаправленных операций может иметь негативное
влияние на производительность и масштабируемость. Тем не менее, необходимо
обеспечить, чтобы сервис не возвращал неограниченно большие объемы данных.
Например, для сервиса, который может возвращать большие объемы
демографических данных, необходимо создать операцию, которая будет
возвращать не все данные за один вызов, а подмножества данных определенного
размера. Размер подмножества данных должен соответствовать возможностям
сервиса и требованиям его потребителей.
Проектируйте расширяемые сервисы и контракты данных, не делая допущений о
предполагаемом клиенте. Иначе говоря, контракты данных должны быть
спроектированы так, чтобы их можно было расширять, не оказывая влияния на
потребителей сервиса. Однако чтобы избежать излишней сложности или для
поддержки изменений, не обладающих обратной совместимостью, возможно,
придется создавать новые версии интерфейса сервиса, которые будут
функционировать параллельно с существующими версиями. Нельзя делать
предположения о клиентах или о том, как они планируют использовать
предоставляемый сервис.
Проектируйте только соответственно контракту сервиса. Слой сервисов должен
реализовывать и обеспечивать только функциональность, оговоренную контрактом
сервиса. Внутренняя реализация и детали сервиса никогда не должны раскрываться
внешним потребителям. Также если возникает необходимость изменить контракт
сервиса для включения новой функциональности, реализованной сервисом, и
новые операции и типы не являются обратно совместимыми с существующими
контрактами, рассмотрите возможность создания версий контрактов. Определите
новые операции, предоставляемые сервисом в новой версии контракта сервиса, и
новые типы передаваемых сообщений в новой версии контракта данных.
Проектирование контрактов сообщений рассматривается в главе 18,
«Взаимодействие и обмен сообщениями».
Отделяйте функциональность слоя сервиса от функциональности
инфраструктуры. В слое сервисов реализация сквозной функциональность не
должен сочетаться с кодом логики сервиса, поскольку это может усложнить