Когда объединять несколько приложений, чтобы упростить интеграцию их данных?

Краткая версия:

У нас есть несколько команд, каждая из которых разрабатывает несколько приложений. Им нужно поделиться некоторыми данными. Должны ли мы объединить эти приложения в одно более крупное, чтобы упростить интеграцию данных, или мы должны держать их отдельно и использовать какой-то механизм обмена/кеширования данных?

Большая версия:

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

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

Другой вариант — решить, что эти приложения совместно используют слишком много данных и что накладные расходы на обмен сообщениями/кэширование слишком высоки. В этом случае вы можете объединить эти три приложения в одно большое приложение. Затем вы полностью устраните проблему интеграции данных, поскольку вы переместите интеграцию в сервисный/транзакционный уровень отдельного модуля приложения. Другими словами, MyGiantApp по-прежнему можно разделить (банки, контексты приложений и т. д.) на различные модули, которые взаимодействуют друг с другом через API транзакционных служб другого модуля. В нашем случае мы будем использовать Spring почти как служебную шину, с вызовом методов вместо веб-сервисов или асинхронного обмена сообщениями.

Хотя этот второй вариант упрощает интеграцию данных, он усложняет разработку. Теперь X-команды должны работать над одной кодовой базой. Это можно несколько упростить, используя ветки, непрерывную интеграцию и отдельные библиотеки/контексты и т. д., но в конце концов это все еще один прискорбный артефакт, который мы все создаем. Кроме того, теперь ошибки одной команды могут легче распространяться на все приложение; одно приложение, выдувающее кучу, может уничтожить все.

Как бы вы решили, когда использовать решение № 1 и когда использовать решение № 2?


person Robert Campbell    schedule 04.10.2010    source источник
comment
Вы определились с подходом? Я думаю о похожей проблеме, а именно об обмене данными. Я хочу узнать, что другие сделали для обмена данными между приложениями и что они учитывали при разработке своего решения. Изучаем консолидацию баз данных, веб-сервисы, ссылки на БД и материализованные представления, асинхронные сервисные шины, MDM, производительность, связь, доступность, дублирование данных и т. д. Любые советы?   -  person jlpp    schedule 26.10.2010


Ответы (3)


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

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

Как бы вы решили...

Вернитесь к основам: начните с того, что, как вы знаете, является правдой.
Проведите семинар на доске с соответствующими людьми из вашей команды, на котором вам необходимо:

  • Составьте список соответствующих ограничений.
  • Перечислите результаты, которые вам не нужны (одно большое неуправляемое приложение и т. д.).
  • Также рекомендуется, но, возможно, не обязательно: Определите риски и потенциальные воздействия (как часть ограничений или нежелательных результатов).
  • Перечислите желаемые результаты (совместное использование данных, простое развертывание и т. д.).
  • Расставьте приоритеты между желательными и нежелательными результатами (очень важно) и не удивляйтесь, если они изменятся в ходе дебатов.

Этой информации должно быть достаточно, чтобы начать создание основы для обсуждения и принятия решений.

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

  • Определите цели системы — как в «деловом», так и в «архитектурном» смысле. (подсказка: они должны совпадать или, по крайней мере, не конфликтовать).
  • Если для системы или вашего бизнеса есть четкое видение, которое должно помочь (но имейте в виду, что они не всегда существуют, а хорошие еще реже).
  • Обратитесь к бизнес-/стратегическим планам систем, над которыми вы работаете, и примите во внимание рынок, тенденции и т. д. Что, по вашему мнению, может произойти с приложениями в будущем? Думать заранее с точки зрения архитектуры это не то же самое, что YAGNI на уровне кода, и тщательное рассмотрение будущего может повлиять на решения, которые вы принимаете сейчас.
person Adrian K    schedule 06.10.2010

Здравствуйте! Не уверен, что освещаю именно те вопросы, на которые вы хотите получить ответы, но это только начало. попросите разъяснений, если хотите, и я соответствующим образом обновлю свой ответ.

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

Что касается интеграции, повторное использование зависит от нефункциональных требований различных систем. Единая общая служба упрощает управление данными (в том смысле, что нужно беспокоиться только об одной копии), но это означает, что она может стать узким местом; кроме того, применяется правило «самого слабого звена в цепочке» — каковы будут последствия, если общий сервис выйдет из строя?

Возможные варианты решения

Трудно понять, что порекомендовать без дополнительной информации, но мои мысли таковы:

  • Держите свои три приложения отдельно.
  • Используйте единую общую службу для общих данных.
  • Доступ к общим данным может осуществляться через «службу» — это даст вам максимальный контроль и возможности.
  • Общая служба может существовать как один экземпляр или у вас может быть развернуто несколько экземпляров службы (но только один экземпляр БД).

Ключевым моментом является то, что вы должны иметь возможность абстрагироваться от общего сервиса, не затрагивая другие приложения — в частности, вам не следует думать о создании приложения uber.

И еще один момент: мысль о том, что существует одна «услуга» в деловом смысле, не исключает наличия нескольких способов ее технического раскрытия и использования.

person Adrian K    schedule 05.10.2010
comment
Привет Адриан, спасибо за вдумчивый ответ. Вы правы, думая, что мы хотим избежать противоречивых справочных данных. В модели одного гигантского приложения это обеспечивается тем, что один модуль контролирует весь доступ к модели данных и все операции чтения/записи, проходящие через API этого модуля. В модели распределенного обмена сообщениями это обеспечивается путем создания транзакционных сообщений и обеспечения того, чтобы локальные кэши данных были доступны только для чтения. Любые записи должны выполняться через приложение владельца/системы записи. - person Robert Campbell; 06.10.2010
comment
Таким образом, в модели гигантского приложения есть только один экземпляр данных, которые читаются и записываются одним модулем. В модели распределенного обмена сообщениями есть один главный экземпляр данных, читаемый и записываемый одним владельцем/системой записи приложения, но в любой другой системе, которой нужны эти данные в качестве ссылки, есть несколько кэшей этих данных только для чтения. Вы на 100% утверждаете, что в распределенной модели процесс распространения, кэширования и ссылки на эти данные должен быть кристально чистым. Это упрощается (немного) благодаря брокеру сообщений (JMS/ActiveMQ), четко отображающему производителей и потребителей. - person Robert Campbell; 06.10.2010
comment
Ваш ответ, кажется, предлагает модель распределенного приложения, но вместо того, чтобы реализовать ее с асинхронным обменом сообщениями + локальные кэши данных, реализовать ее с помощью служб синхронизации (RMI, веб-службы и т. д.). Преимущество этой синхронной модели заключается в том, что она позволяет избежать необходимости в локальных кэшах данных, но, как вы правильно заметили, она более хрупкая. Цель асинхронного обмена сообщениями заключалась в том, что когда приложение системы записи выходит из строя, оно также не удаляет всех потребителей этих данных, поскольку у них есть собственный локальный кеш. Локальные кэши также решают проблему производительности больших моделей данных, отправляемых по сети. - person Robert Campbell; 06.10.2010

Думали ли вы о параллелизме, транзакциях,...

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

person Gerrie Schenck    schedule 04.10.2010
comment
Транзакции: JTA будет использоваться для сообщений JMS. Параллелизм в нашем случае является меньшей проблемой, потому что у нас не будет параллельной записи; существует одна система записи, отвечающая за управление операциями записи. Затем данные будут транслироваться через простую модель производитель/потребитель. Потребители не будут обмениваться этими данными друг с другом и т. д. Я не понимаю ваш последний комментарий, потому что в обоих сценариях есть центральный репозиторий для управления общими данными. Вопрос в том, как получить доступ к этим данным. - person Robert Campbell; 04.10.2010