Architektura systemu informatycznego [remoting]

0

Witam,

obecnie jestem na etapie planowania większego systemu informatycznego i chciałbym wykorzystać dobre praktyki.
Opis problemu: Będą 2 typy aplikacji przetwarzające dane z bazy danych. System będzie oparty na remotingu ze względu na ilość klientów. I teraz pojawia się pytanie jak przetwarzać dane z BD i jak je udostępniać.

Myślałem, aby dostęp do bazy danych był dostępny za pomocą serwera aplikacji. Zaimplementowałbym metody (w klasie serwera), które mogą być invokowane przez klientów. Do tego pasuje mi serwer typu singleton ale tutaj pojawia się pytanie. Co jeśli jeden klient wywoła metodę z serwera, która będzie wykonywała się przez 20 sekund? Czy inny klient będzie mógł podczas tych 20 sekund wywoływać metody? Czy też obiekt serwera będzie zablokowany na 20 sekund do momentu wykonania?

A może macie inne, lepsze rozwiązanie problemu?

będę wdzięczny za rady,
pozdrawiam

0
synchronized napisał(a)

Będą 2 typy aplikacji przetwarzające dane z bazy danych.
jakie?

System będzie oparty na remotingu ze względu na ilość klientów.
czyli ile tych klientów będzie? Góra 10?

Myślałem, aby dostęp do bazy danych był dostępny za pomocą serwera aplikacji.
czyli konkretnie

Generalnie to wygląda mi to na wymyślanie jakichś dziwnych rzeczy, z którymi nie miałeś wcześniej do czynienia. Być może się mylę, i np. pisząc o remotingu wcale nie masz na myśli net remoting

0
Misiekd napisał(a)
synchronized napisał(a)

Będą 2 typy aplikacji przetwarzające dane z bazy danych.
jakie?

Jeden typ to tzw aktor, który będzie dodawał zadania do bazy danych. Drugi to agent, który będzie je tylko realizował na osobnym pc.

Misiekd napisał(a)

System będzie oparty na remotingu ze względu na ilość klientów.
czyli ile tych klientów będzie? Góra 10?

Szacunkowo aktorów max 8-10, agentów do 30.

Misiekd napisał(a)

Myślałem, aby dostęp do bazy danych był dostępny za pomocą serwera aplikacji.
czyli konkretnie

Czyli obiektu serwera, np typu singleton tak jak to opisałem poniżej.

Misiekd napisał(a)

Generalnie to wygląda mi to na wymyślanie jakichś dziwnych rzeczy, z którymi nie miałeś wcześniej do czynienia. Być może się mylę, i np. pisząc o remotingu wcale nie masz na myśli net remoting

Generalnie zbudowałem już taki system kilka miesięcy temu ale na trochę innych założeniach a teraz chcę podejść do tego bardziej profesjonalnie i zmienić aspekty, które na to zasługują.
Teraz działa to tak:
Mam klasę serwera reprezentującą obiket typu singleton. Usługa jest startowana w osobnej aplikacji (hoście).
Mam 2 aplikacjie, agent i aktor, które się łączą z serwerem (generalnie serwer teraz zbiera informacje o zalogowanych do niego userach oraz udostepnia kluczowe dla systemu metody).
Połączenie z BD udostępniam już na poziomie aplikacji agent/aktor, gdzie każda z nich może się komunikować z BD (ale taka samowolka może narobić kuku jak liczba podłączonych userów będzie > 5-10.

0

nie zrozumieliśmy się - piszesz ogólnikowo bez żadnych konkretów. Po pierwsze mam nadzieję, że "serwer aplikacji" to jest aplikacja na innym kompie niż aplikacje klienckie bo inaczej to średnio ma sens. Nie piszesz nic o tym jak chcesz się komunikować z tym serwerem (może WebService). Nie wiem jak teraz działa remoting, ale za czasów net 2.0 to trzeba się było trochę nagimnastykować żeby to działało dwukierunkowo. No i najważniejsze - co Ci nie odpowiada w poprzednim projekcie?

0
Misiekd napisał(a)

nie zrozumieliśmy się - piszesz ogólnikowo bez żadnych konkretów. Po pierwsze mam nadzieję, że "serwer aplikacji" to jest aplikacja na innym kompie niż aplikacje klienckie bo inaczej to średnio ma sens. Nie piszesz nic o tym jak chcesz się komunikować z tym serwerem (może WebService). Nie wiem jak teraz działa remoting, ale za czasów net 2.0 to trzeba się było trochę nagimnastykować żeby to działało dwukierunkowo. No i najważniejsze - co Ci nie odpowiada w poprzednim projekcie?

Serwer aplikacji jak najbardziej znajduje się na osobnym pc.
Obecnie na aplikacjach agentów działam jednokierunkowo. Co 5 sekund wywołuję metodę na rzecz obiektu serwera i sprawdzam, czy są dostępne zadania dla tego rodzaju agenta.
Jeśli tak, pobieram jedno i wykonuję. Obecnie może się zdarzyć, że 2 agentów w tym samym czasie pobierze to samo zadanie. Oczywyście status zadania mogę zmienić na serwerze i wtedy nie powinno być problemu.

Teraz zarówno agent jak i aktor posiadają klasę implementującą sterownik do DB. Wrzucenie tego w jedno miejsce (serwer) byłoby chyba lepszym rozwiązaniem bo wszystko byłoby w jednym miejscu i wrzystko byłoby wywoływane z obiektu serwera, do którego łączy się każdy klient.
Ale tutaj mam wątpliwość, czy obiket serwera typu singielton nie będzie blokowany przez dłuższe operacje i przez to inny agent nie będzie mógł czerpać danych z DB.

Tak jak wspomniałem na wstępie, ważne są dla mnie uwagi, czy takie rozwiązanie jest rozsądne (póki co wiem, że jest funkcjonalne).
Czy dla rozwiązania takich problemów lepiej zaimplementować coś innego?

0

Tak sobie czytam i mi to idealnie pasuje pod Grid computing. Zainteresuj się tym rozwiązaniem, bo jest na prawdę ciekawe. Co prawda wsparcie dla C# jest liche, ale troche ciekawych narzędzi jest dostępnych.

0

Zamiast przestarzałego Remoting użyj WCF. Jest komunikacja Duplex po TCP lub HTTP (dwa kanały) .

0

Teraz zarówno agent jak i aktor posiadają klasę implementującą sterownik do DB. Wrzucenie tego w jedno miejsce (serwer) byłoby chyba lepszym
Zdecydowanie odseparuj klientów od bazy przez serwer. Po to buduje się serwer aby był on pośrednikiem. Klienta nie obchodzi czy serwer korzysta z bazy X, czy Y, a może plików xml, tekstowych, albo siedzi tam pani Krysia i wciska odpowiednie guziki etc.

obiket serwera typu singielton nie będzie blokowany przez dłuższe operacje
Nie do końca mam jasność jak to zrealizowałeś. Aby klienci byli obsługiwani równolegle, każdy musi być obsługiwany przez osobny wątek (request musi być przetwarzany), czy przez jakąś pulę wątków. Inaczej requesty będą się kolejkonowały bez względu czy masz singleton czy nie. Dlatego sugestia siema cześć i czołem o użyciu WCF jest bardzo słuszna, bo nie będziesz sobie zaprzątał głowy kwestiami jak zreazlizować serwer i obsługiwać requesty, a jedynie jak skonfigurować go wg własnego uznania. Singleton jako obiekt udostępniający metody w niczym nie przeszkadza, jeśli będziesz miał w tym obiekcie pola, z których będą korzystały metody (mam nadzieję że nie), to będziesz miał problem z zapewnieniem synchronizacji dostępu do tych pól, tylko wtedy w gruzach legnie przetwarzanie równoległe.

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