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
- 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)
- Analiza bazy danych i stworzenie Linked Servera do obsługi widoków w mojej aplikacji
- 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 - 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 :)