Sposoby integracji z zewnętrznymi serwisami

0

Hej,
Napisałem już kilka integracji z systemami ERP; pobieranie produktów, kontrahentów, dokumentów; ale jakoś ciągle nie mogę dojść do idealnego dla mnie rozwiązania
Poniżej moje sposoby i chciałbym żebyście ocenili je i wypisali wady i zalety albo dopisali swoje rozwiązania które się sprawdzają u was

  1. Pobieranie wszystkiego raz na jakiś czas, sprawdzanie czy istnieje już u mnie i jeśli tego nie ma to dodanie a jeśli jest to aktualizacja (bardzo wolne, jednak niektóre api nie dają możliwości pobierania danych po dacie modyfikacji)
  2. Analiza bazy danych i stworzenie Linked Servera do obsługi widoków w mojej aplikacji
  3. Wykorzystanie api ERP i pobieranie na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) odpowiednich danych
    3.1 Tu wracamy do punktu pierwszego bo czasami potrzebuję mieć wszystkie rzeczy od razu, np.: produkty
  4. Analiza bazy i stworzenie triggerów, np.: aktualizacja produkt -> trigger zapisuje do mojej tabelki zmianę -> moje api pobiera wszystkie zmiany i je przetwarza
    4.1 Integrowałem się ostatnio z programem Nexo jednak struktura bazy danych jest dość skomplikowana i Nexo nie aktualizuje po zapisie np produktu wszystkich kolumn tylko te które zmodyfikowałem czyli tym sposobem musiałbym nadać kilkadziesiąt triggerów na kilka tabel (dodawanie, aktualizacja, usuwanie) aby to wszystko sprawnie działało

Obecnie wydaje mi się, że sposób 4 jest najlepszy, ponieważ daje on mi dane tylko te które zostały zmodyfikowane, moja aplikacja je kopiuje i ma wszystko u siebie. nie potrzebuje do działania erpa. Jest też dobre pod względem jakiejś awarii w braku komunikacji api -> moja aplikacja, ponieważ wszystko jest zapisane przez triggery w tabelce i oczekuje na pobranie.

Dane z api pobieram poprzez zadanie w hangfire uruchamianie co kilka minut. Co jeśli chciałbym mieć te dane natychmiastowo, hangfire ma limit na 1min minimalnie. Uruchomić zadanie poza hangfire i sprawdzać co 5s czy jest coś do przetworzenia w tabelce kolejki?

Minus tego jest taki że wszystko dzieje się w jednym wątku i jest bardzo wolne przy dużej ilości danych do przerobienia, ale plus taki, że mogę sobie wszystko poukładać co w jakiej kolejności ma się synchronizować.
Wpadłem ostatnio na pomysł aby zrobić sobie takie mechanizm producent -> konsumenci czyli jeden wątek przetwarza kolejkę z api i tworzy nowe zadania w hangfire. Minus jest takie, że czasami pojawiają się duplikaty danych jak w jednym czasie dwa wątki zaczął przetwarzać to samo zadanie z kolejki (niektóre programy erp kilka razy aktualizują ten sam rekord; w producencie grupuje te dane).

Mam tu jeszcze jeden problem, ponieważ w tabelce kolejki mam kolumnę w której oznaczam czy zadanie zostało już wykonane czy nie. Zadanie jest wykonane po dodaniu go do mojego systemu, więc będzie tak, że producent będzie pobierać kilka razy to samo zadanie do przetworzenia.

Jest też kilka innych minusów w tej integracji jak np.: uruchamianie kilku instancji aplikacji i przetwarzanie zadań, same zadania w hangfire i ich żywotność, zauważyłem też że przy dużej ilości danych do przetworzenia stopniowo zwalnia mi przetwarzanie danych - tu prawdopodobnie winą jest EntityFramework

Chciałbym stworzyć jak najprostsze rozwiązanie które będę mógł wykorzystać w kilku programach jednak cały czas wydaje mi się, że te moje rozwiązania są zbyt skomplikowane i istnieje jakiś inny sposób który ułatwi mi życie :)

0
  1. najwolniejsze i najbardziej zasobnożerne ale czasami nie da się inaczej
  2. tylko jeśli wystarczą Ci dane readonly (chyba, że nie zrozumiałem idei)
  3. praktycznie nie różni się od 1 poza dodatkowym narzutem na jakiegoś ORMa
  4. na chwilę obecną osobiście nie wymyśliłem nic lepszego/szybszego :p
    też mam integrację z nexo (w obie strony nawet). O ile dane, które pobieram są wystawiane triggerami do dodatkowej tabelki a potem już aplikacja pobiera sobie odpowiednie rekordy, o tyle w drugą stronę wszystko dzieje się przez API nexo.
    Jeszcze przy własnych systemach źródłowych mam jeden patent - dodatkowe dwa pola w tabelach, z których muszę aktualizować dane - globalne id (autoincrement ale takie, które działa globalnie np. oracle takie pozwala dodać, w innych bazach można użyć timestamp) oraz znacznik, czy dane zostały dodane czy zmienione. Oczywiście wtedy dochodzi jeszcze kwestia usuwania rekordów i można je np. wpisywać do tabeli zbiorczej albo zorganizować samą bazę i aplikację tak aby dane nie były usuwane a jedynie oznaczane jako usunięte.
0

Jeśli systemy z którymi będziesz się integrował stoją na MS SQL Server to opcją jest SQL Service Broker. Korzystałem z tego kilka lat temu przy integracji ERP. Trochę było zawodne i ciężkie w konfiguracji (wymóg specyficznych uprawnień) ale robiło robotę. Inną opcją może być rozwiązanie na zasadzie Event Sourcingu pchanego z bazy. Czyli trigger pchający payload gdzieś do kolejki (Rabbit MQ, Kaffka) i na to zapięte serwisy, które Ci to obrobią. To że jakiś update jest robiony w kilku krokach (też miałem takie kwiatki z Comarchowym CDN XL) nie powinno stanowić problemu. Każdy taki update traktujesz jako event, który trzeba obsłużyć.

0

Niektórzy polecają też NODE-RED, czyli taki graficzny flow, mający pod spodem NODE.JS ;-)

1

Do integracji systemów informatycznych, tworzenia mikro usług i synchronizacji baz danych (aktualnie pracuję nad rozwiązaniem) wykorzystuję Node-RED. Jednym narzędziem rozwiążesz praktycznie każdy problem, nie ograniczasz się tylko do Node.js bo możesz wystawić usługę w innym środowisku i komunikować się np. via klient MQTT. Co istotne, narzędzie dostarcza dwie metody abstrakcji, dla programisty (tworzenie funkcjonalnych kostek) i analityka/informatyka/architekta rozwiązań (edytor przepływów i podprzepływów z wykorzystaniem kostek). Takie rozwiązanie pozwala kontrolować rozwój projektu w sposób bardziej zorganizowany i czytelny. Dodatkowo możesz piąć się w jeszcze wyższy poziom abstrakcji i połączyć NR z Zeebe. Projekty NR możesz synchronizować z repozytorium git. Kiedy chcesz się podzielić rozwiązaniem, "kodem" przepływu/przepływów, możesz go skopiować i wkleić jak zwykły tekst, zainteresowany importuje wklejony przez Ciebie tekst do edytora NR.
Doskonałe wsparcie produktu przez autorów i społeczność m.in. na Slack'u.
Przecieram szlaki tworzenia rozwiązań biznesowym z wykorzystanim tego narzędzia od 2-3 lat. Nie wyspecjalizowałem się w nim jeszcze tak jakbym sobie tego życzył, ale idę do przodu.

Jeżeli masz jakieś pytania, projekt do zrealizowania, nawet jako przykład do realizacji rozwiązania z wykorzystaniem NR, wal jak w dym :) Służę zdobytą wiedzą i doświadczeniem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1