Как правильно интегрировать несколько систем в компании?
Привет,
Проблема существует практически на всех предприятиях, но обычно это разные системы, типа 1с на кадры, самописная c# по документам и какая-нибудь готовая опен-сорц система поддержки на php. Ваш вариант, что всё написано на одной технологии благо, используйте это, заворачивайте в нугет библиотеки.
Про esb - все очереди используются для синхронизации данных. То есть, у вас изменился некий сотрудник в кадрах, сохраняется не напрямую в бд, а через очередь. Другие системы так же подписаны на эту очередь и обновление сущности сотрудника идёт во всех системах, которые хранят дубли необходимых им данных. Как вы понимаете, тут куча накладных расходов и нештатных ситуаций. За этим нужно следить и как-то восстанавливать/докачивать данные. Тем не менее, это самый правильный вариант, ибо в противном случае синхронизацию данных делают кастылями через вьюхи/джобы/хранимки и как только отвратительно не делают. В общем, если хватает скиллов - делайте так, будут независимые рабочие приложения.
По общению через апи - там нет проблем с какими-то маленькими и атомарными операциями. Проблемы начинаются когда необходимы _распределённые транзакции_ погуглите про это, как реализовывают и оцените насколько тяжелее будет разработка. Вторая тут проблема - это отчёты, тупо джоины. Вам нужно выгрузить какую-то консолидированную инфу из одной системы, вы делаете, но в ней у вас только айдишники пользователей. Либо вы эти айдишники отправляете в сервис кадров и получаете развёрную инфу по каждому, либо на каждый такой запрос вообще грузите полный список пользователей. А потом ещё говорят, нужно исключить данные по пользователям на время их отсутствия. Опять же эти данные в сервисе кадров и, в общем, нужно лепить какой-то большой снежный ком не из снега. Окей, если прям вопрос с отчётами, можно будет заводить какие-то консолидированные хранилища и все системы будут туда сливать данные, но вот при обычном использовании вам всё равно потребуется делать большие джоины, какие с этим косяки я примерно описал.
По варианту общих сервисов, я за него из-за простоты:
Хранить строки подключений нужно в каждом проекте - это не проблема
Дублировать бизнес-логику не нужно, выносите её так же в общие сервисы
Обновлять будет нужно оба сервера, если в общем сервисе баг. Тут разговор, очевидно, про "баг на проде" - из-за общего кода будет баг на обоих продакшенах. Окей, как часто у вас возникают такие ситуации и насколько долго обновить два прода вместо одного?
Только одна система, и больше никак! Во всяком случае со стороны пользователя. Если говорить про реализацию, то лучше исходить из особенностей компании и систем. Обычно в качестве переносчиков данных между системами являются менеджеры, которые только этим и занимаются и получают за это деньги.
Если по-умному, то нужно расслоить системы на компоненты, затем объединить одинаковые компоненты (например, бд) в один+продумать грамотное API, удобное для всех систем.