Я недавно прочитал эту прекрасную статью по архитектуре конструирование http://www.infoq.com/articles/microservices-intro
В нем говорится, что при загрузке веб-страницы на Amazon, то 100+ микрослужб сотрудничать, чтобы служить этой странице.
Это статья описывает, что все общение между микрослужб может идти только через API. На мой вопрос почему это так плохо, чтобы сказать, что все операции записи в базу данных может идти только через API, но вы можете прочитать непосредственно из баз данных различных служб. Можно например сказать, что лишь немногие виды баз данных доступны за пределами микро-услуг, так что команда сохранения в микро-сервис знают, что пока они держат эти мнения нетронутыми, то они могут изменить структуру базы данных, их микро-услуги столько, сколько они хотят.
Я что-то пропустил? Есть какая-то другая причина, почему данные должны быть прочитаны только через API?
Излишне говорить, что моя компания значительно меньше, чем Amazon (и всегда будет) и максимальное количество пользователей, мы можем иметь около 5 миллионов.
Базы данных не очень хорошо скрывает информацию, которая вполне правдоподобна, потому что их работа на самом деле выставить информацию. Но это делает их паршивым инструментом, когда дело доходит до заключения. Почему вы хотите инкапсуляции?
Сценарий: вы завяжите пару компоненты к СУБД напрямую, и вы видите одного конкретного компонента становится производительность бутылка-шея, за которые вы, возможно, захотите, чтобы денормализовать базу данных, но вы можете't, потому что все остальные компоненты будут затронуты. Вы можете даже осознать, что вы'd быть лучше с магазина документ или база данных графика, чем в РСУБД. Если данных инкапсулируется в небольшое API, у вас есть реальный шанс реализовать сообщил АПИ любым способом, вам нужно. Можно незаметно вставить слои кэше, а что нет.
Возиться со слоем хранения напрямую из слоя приложение является диаметральной противоположностью, что принцип инверсии зависимостей предполагает заняться.
Что является более важным и значимым про конструирование своего API или схемы базы данных? API, потому что это его контракт с остальным миром. Схема базы данных-это просто удобный способ хранения данных, управляемых службой, надеюсь организован таким образом, что оптимизирует конструирование´ы производительности. Команда разработки должна быть свободной, чтобы реорганизовать эту схему - или переключиться на совершенно другое решение, хранилище данных - в любое время. Остальной мир не должен заботиться. Весь остальной мир волнует, когда API изменения, поскольку API является контракт.
Теперь, если вы продолжаете заглядывать в их базе
Последних двух пунктов может и не случиться, если вы только получили доступ на чтение, но и другие более веская причина. Общие базы данных-это плохо.
Она является общей для менее опытных разработчиков (или тех, кто не знает), чтобы увидеть базу данных, как более важное, чем служба, чтобы увидеть базу данных как реальный дело и сервис просто способ добраться до него. Это неправильно.
Архитектура конструирование-это трудно описать, но лучший способ думать об этом является брак между ориентированная компонентная архитектура и сервисно-ориентированной архитектуры. Программное обеспечение как люкс состоит из множества мелких элементов бизнеса с весьма специфическим бизнес-домен ответственности. Их взаимодействие с внешним миром либо в предоставляемых услуг или необходимых услуг через API четко определенных услуг.
Пишу и даже чтение из базы данных, которая находится за пределами ваших компонентов бизнес-домен против этого стиля архитектуры.
Основной причиной этого является то, что API, предоставляемых через службу другим компонентом программного обеспечения, разумно ожидать, что API, скорее всего, будет обратная совместимость в новых релизах сервиса предоставляя компонента становятся доступными. Если я разработчик и "Обеспечение" и компонент, тогда мне нужно волноваться только об обратной совместимости для моих API. Если я знаю, что есть три других команд разработчиков, которые писали пользовательские запросы к базе данных напрямую, то моя работа стала намного сложнее.
Даже хуже, возможно, что и другие команды, которые написали эти среднеранний "спринт" в критическом проекте, и они могут'т принять сейчас это меняется от компонента. Теперь разработка программного обеспечения для компонента на бизнес-домен, которым вы владеете обеспечивается за счет развития другой сферы бизнеса.
Полное взаимодействие с помощью служб уменьшить связь между различными компонентами программного обеспечения, так что такие ситуации возникают не так часто. Когда дело доходит до других компонентов, используя представления в базе данных, тогда Вы имеете больше возможностей для обратной совместимости, если кто-то еще писал запросы. Я все еще чувствую, однако, что это должно быть исключением и должно быть сделано только возможно для отчетности или пакетная обработка, при которой приложения будут нужно читать в огромном количестве данных.
Очевидно, что это хорошо работает в больших распределенных команд, где команды разработчиков разделены на сферы бизнеса, как Amazon. Если вы находитесь в небольшом магазине, вы еще можете воспользоваться этой моделью, особенно если вам нужно быстро для большого проекта, но и если вам приходится иметь дело с поставщиком программного обеспечения.
За последние 20 лет я'вэ видел несколько большие модульные базе разработки и я'вэ видел сценарий, предложенный Дэвидом несколько раз, когда приложения имеют доступ на запись в свою собственную схему/набор таблиц и на чтение другой схема/набор таблиц. Чаще всего это данные, которые приложения/модуля получает доступ только для чтения, может быть описан как "в основных данных" по. В то время я не видел проблемы, что до ответов, предполагая, что я должен был увидеть, так что я думаю, что это стоит иметь пристальный взгляд на вопросы, затронутые в предыдущих ответах более подробно.
сценарий: у вас завязывать пару компоненты к СУБД напрямую, и вы видите, что один определенный компонент становится в горлышко бутылки производительность Я согласен с этим комментарием, кроме это тоже аргумент для иметь копию данных локально для конструирование для чтения. То есть, наиболее зрелой баз данных, поддержка репликации и так без каких-либо усилий от разработчика и"основные данные" могут быть физически реплицируются в базу данных конструирование, если это желательно или необходимо. Некоторые могут признать это в старых шумок как "на базе предприятия" тиражирование основных таблиц, а "ведомственные базы данных". Точка здесь является то, что в целом это хорошо, если база данных это для нас с встроенной репликации изменений данных (дельты только в бинарном виде и с минимальными затратами для базы данных-источника). И наоборот, когда в базе выбора не позволяют это 'с полки' репликация поддержку, то мы можем попасть в ситуацию, когда мы хотим подтолкнуть "в основные данные то" на конструирование баз данных, и это может вылиться в значительную сумму от разработчика усилий, а также быть существенно менее эффективный механизм. возможно, захотите, чтобы денормализовать базу данных, но вы можете't, потому что все остальные компоненты будут затронуты Для меня это утверждение просто не верно. Denormalisation представляет собой "добавка" и изменений, а не на "нарушению" и приложение не должно сорваться из-за denormalisation. Единственный способ это взломать приложение, где код приложения использует что-то вроде "и выберите * ..." и не обрабатывает дополнительный столбец. Мне, что бы ошибки в программе? Как denormalisation сломать приложение? Звучит как-фуд для меня. схемы зависимостей: Да, приложение теперь имеет зависимость от схемы базы данных и подразумевается, что это должно быть серьезной проблемой. При добавлении каких-либо дополнительных зависимостей, очевидно, не подходит мой опыт заключается в том, что в зависимости от схемы базы данных не было проблемой так почему это может быть дело? Я просто повезло? Основные данные
Схему, мы, как правило, может понадобиться конструирование иметь доступ только для чтения, чаще всего, что я'd описывают как "основные данные" и для предприятия. Это основные сведения, необходимые для предприятия. Исторически это означает, схемы мы добавляем зависимость является как зрелый и стабильный (несколько основных предприятия и неизменен). Нормализация
Если 3-дизайнеры базы данных и проектирования нормализованных схем БД они'll итоге в том же дизайне. Ок, там могут быть некоторые вариации 4НФ/5НФ, но не сильно. Что's больше, есть ряд вопросов, которые можно задать для проверки модели таким образом, дизайнер может быть уверен, что они добрались до 4НФ (я не слишком оптимистичен? Люди борются добраться до 4НФ?). обновление: ПО 4НФ здесь я имею в виду всех таблиц в схеме должны их высокие нормальные формы до 4НФ (все таблицы есть надлежащим образом нормализуется до 4НФ). Я считаю, что процесс проектирования нормализации почему разработчики баз данных, как правило, знакомы с идеей в зависимости от нормализованная схема базы данных. Процесс нормализации получает дизайн ДБ известной как "правильный" и дизайн и варианты от там должны denormalisation на производительности.
- Там могут быть варианты, в зависимости от типа БД поддерживается (формат JSON, массива, Гео тип поддержки и т. д.)
- Некоторые могут возразить, для вариации, основанные на 4НФ/5НФ
- Мы исключаем физические изменения (потому что это'т материи)
Мы ограничиваем этом в OLTP-дизайн, а не ДГ дизайна, потому что эти схемы мы хотим предоставить доступ только для чтения Если 3 программистов при реализации (код) ожидание будет по 3 разных реализаций (потенциально очень разные). Мне там потенциально вопрос на "вера в нормализации и". Критические изменения схемы?
Denormalisation, добавив столбцы, изменять столбцы для больших хранилища, расширение дизайн, новые столы и т. д. все критические изменения и ДБ дизайнеров, которые добрались до 4-й нормальной форме будет, в этом уверены. Критические изменения, очевидно, можно путем перетаскивания столбцов/таблиц или разрушение изменения. Возможно да, но в практическом плане я'вэ не испытывали никаких проблем здесь вообще. Возможно, потому, что он понимал, что критические изменения, и они были хорошо управляется? Я'd быть заинтересованы, чтобы услышать случаи нарушения схемы изменения в контексте общей только для чтения схем'ов. что является более важным и значимым про конструирование своего API или схемы базы данных? API, потому что это его контракт с остальным миром. Хотя я согласен с этим утверждением, Я думаю, есть важный нюанс, что мы могли бы услышать от предприятия архитектор, который "в жизни данные навсегда" по. То есть, в то время как API может быть самое главное, эти данные также весьма важным для предприятия в целом и будет иметь большое значение в течение очень долгого времени. Например, когда есть требование для заполнения хранилище данных для бизнес-аналитики схема и CDC поддержки становятся важными из бизнеса зрения отчетности, независимо от интерфейса API. Проблемы с API'ы?
Теперь, если API'ы были совершенны и легко все пункты очень спорны, как мы'd всегда выбрать API, а не иметь местный доступ только для чтения. Так что мотивация даже учитывая локальный доступ только для чтения заключается в том, что там могут быть некоторые проблемы с использованием API's, что локальный доступ избегает.
What motivates people to desire local read-only access?
В LinkedIn интересная презентация (с 2009 года) по вопросу оптимизации их API и почему это важно для них в их масштаб. http://www.slideshare.net/linkedin/building-consistent-restful-apis-in-a-highperformance-environment Короче, после того, как API должен поддерживать множество различных вариантов использования, его можно легко попасть в ситуацию, когда он поддерживает в одном случае оптимально использовать и остальные довольно плохо с точки зрения сети и точки зрения базы данных. Если API не имеет такую же утонченность, как LinkedIn, то вы можете легко получить сценариях:
Государственного управления (потенциально база данных) могут быть развернуты в микрослужб'контейнер с открытой через API. А конструирование'база данных не видимым для других систем вне контейнера - только при помощи API. В качестве альтернативы вы могли бы иметь другую услугу (например, кэш) управлять через API. Имея все микрослужб'зависимости s (кроме вызовов API для других услуг) в рамках одного развертывания контейнера является ключевым отличием в архитектуре. Если не сделать это вернуться и изучить архитектуру.