2010-08-07 15 views
5

Mam aplikację klienta/serwera napisaną Delphi. Zasadniczo cała aplikacja robi to przesyłanie strumieni danych xml pomiędzy aplikacją serwera i podłączonymi klientami. Obecnie używam składnika Indy TIdTCPServer. Ale aplikacja po stronie serwera zawiesza się na niektórych moich ratach. Bardzo ciężko było debugować. Zastanawiam się więc, czy istnieje jakaś "architektura", którą powinienem wykorzystać, która wykonuje całe zarządzanie połączeniami tcp/ip i łączenie baz danych, pozwalając mi skoncentrować się na logice biznesowej.Której technologii Delphi użyć?

Oto więcej szczegółów:

  • klienci muszą utrzymać "uporczywy" połączenie. Czasami serwer musi powiadamiać i wysyłać dane do wszystkich podłączonych klientów.
  • klienci łączą się z komputerów przenośnych za pomocą bezprzewodowych kart bezprzewodowych. Więc "krople" sieci są dość powszechne.
  • Baza danych bazy danych to SqlServer.
  • Może znajdować się w górę 100 komputerów jednocześnie połączonych jednocześnie. Gdy serwer otrzymuje nowe połączenie (TCPServer.OnConnect), tworzę własny obiekt zawierający własne połączenie z bazą danych SqlServer. Kiedy połączenia TCP są upuszczane, ja z kolei uwalniam te obiekty (i powiązane połączenie z bazą danych).
  • Aplikacja kliencka ma wbudowany TTimer. Rutynowo wysyłają bicie serca na serwer. A jeśli "upuszczają"/"tracą" swoje połączenie, automatycznie nawiązują nowe połączenie po powrocie sieci.

Ktoś ma jakieś sugestie dotyczące najlepszego podejścia/architektury tutaj?
Zakładam, że komponent Indy będzie działał, ale jednocześnie czuję, że "wymyślam nowe koło" w odniesieniu do zarządzania połączeniami.

zestawy
+1

Tocząc własne środki przeznaczasz procent czasu na utrzymanie własnego systemu. Aby wzmocnić swoją efektywność w Delphi, twój pomysł, że powinieneś chyba ocenić komercyjne obsługiwane technologie/zestawy narzędzi/komponenty, które są już zbudowane i wspierane, są doskonałe. Oczywiście narzędzia open source również mogą być dobre. Ale jeśli twój czas jest mniejszy niż twoje pieniądze, idź z komercyjnymi rozwiązaniami. –

+0

Absolutnie - dokładnie to, do czego dążę. Chcę tylko sprawdzonej architektury C/S "3 warstwowej", która działa. –

Odpowiedz

6

Trzy składowe Jestem świadomy, że będzie dbać o Maryla Rodowicz technicznych aspektów aplikacji klient-serwer dla Ciebie:

Być może będziesz musiał przerobić swoje aplikacje, aby skorzystać ze sposobu działania tych zestawów komponentów, ale zakładając, że poprawnie rozdzielić warstwy, które nie powinny być zbyt wielkim problemem i przyniosą ci korzyść dobrze przetestowanego i powszechnie używanego kodu do pracy serwera klienta.

+1

+1. Oceniłem RemObjects i kbmMW i są one DOSKONAŁE. Nie oceniłem Asta, ale wygląda obiecująco. –

+3

Asta prawdopodobnie nie jest najlepszą opcją, ponieważ nie jest już aktywnie rozwijana. –

+0

@ dmauric.mp: dzięki, nie wiedziałem tego. Patrząc na stronę, wygląda to całkiem nieaktualnie: wspominając o Asta 3.0 z obsługą Delphi do wersji 7 i ostatnią aktualizacją strony głównej 28 stycznia 2006 ... –

1

Jeśli potrzebujesz lekkich elementów TCP/IP, spójrz na naszą jednostkę SynCrtSock.

Znajdziesz klasy niskiego poziomu, aby utworzyć klienta IP i serwery. Zaimplementowaliśmy zarówno TCP/IP, jak i UDP/IP w jednej z naszych aplikacji.

Istnieje również klasa THttpServer, która implementuje serwer HTTP/1.1. Dlatego jest zgodny z zarządzaniem połączeniami HTTP/1.1. Istnieje również opcjonalna kompresja, a używanie HTTP/1.1 na porcie innym niż 80 nie jest złym pomysłem. I co jest dobre z HTTP/1.1, to że może przechodzić przez zapory ogniowe i może być łatwo VPNed lub hostowany na innym serwerze HTTP (jak IIS lub Apache) z serwerem proxy. Istnieje nawet klasa FastCGI, jeśli potrzebujesz takiego serwera w ramach rozwiązania opartego na Linuksie. Oczywiście klasa ThttpClientSocket robi to samo na klasie klienta.aby dodać HTTP/1.1 podłączenie do naszego relaksującego ramach Open Source Sqlite3

Używamy tych klas - http://synopse.info/forum/viewforum.php?id=2

Zobacz http://synopse.info/fossil/artifact?name=722e896e3d7aad1fe217b0e2e7903483e66d66d1 dla jednostki SynCrtSock. Open source, praca od Delphi 7 do Delphi 2010.

+0

Czy protokół HTTP automatycznie przyjmuje wartość "Stateless" w tym sensie, że klient nawiązuje połączenie i żąda, serwer odpowiada danymi, a klient się rozłącza? Ta konkretna aplikacja musi utrzymywać stałe połączenie. –

+0

HTTP/1.1 definiuje trwałe połączenie. W naszej implementacji ustawiamy właściwość "KeepAliveMS" (po stronie klienta), aby utrzymać połączenie podczas określonej podanej wartości milisekund. Jest bezstanowy z punktu widzenia serwera, ale połączenie nie jest zepsute. Przy tak trwałych połączeniach widziałem X10 do prędkości zwiększania prędkości x40 w systemie Windows. Możesz używać plików cookie w celu zapewnienia funkcji sesji. Ale ponieważ chcieliśmy wdrożyć framework RESTful, nie używaliśmy ciasteczek, ale czystego schematu bezstanowego. –

1

Misha Charrett's CSI Application Framework pokrywa dokładnie to, o co prosisz.

Jest to środowisko open source Delphi, które w swojej istocie jest rozproszonym przekazywaniem wiadomości i strukturą wątków, która umożliwia przekazywanie wiadomości XML z klienta do serwera i serwera do klienta.

Może obsługiwać rozłączenia/ponowne połączenia, wysokie numery klientów i istnieje opcjonalna biblioteka wirtualnej bazy danych, która obsłuży serwer SQL (lub możesz po prostu użyć tego samego dostępu do serwera SQL, którego teraz używasz).

Nie jest to jeszcze dobrze znane, ale mogę powiedzieć, że zostało ono aktywnie opracowane w ciągu ostatnich kilku lat i że autor Misha jest bardzo chętny do pomocy każdemu, kto jest zainteresowany korzystaniem z niego w swojej aplikacji.

+0

Dzięki - sprawdzę to. –

0

Jeśli używasz Indy, każde połączenie będzie równe wątkowi.

W każdym razie, proponuję do podłączenia do MSSQL używać SDAC z Devart http://www.devart.com/sdac/ i dla warstwy łączącej korzystania HPScktSrvr opartego na I/O Completion Port od http://www.torry.net/authorsmore.php?id=7131 (nie wiem jednak, jakie zmiany będą potrzebować zmian TThread w nowszym VCL). Tworzysz klasę klienta wokół THPServerClient, ustawiasz nową klasę jako serwer ClientClass, a framework automatycznie utworzy dla ciebie nowych klientów.

0

Można też rzucić okiem na ICS/Midware combo: http://www.overbyte.be/

+0

Będę musiał spojrzeć z powrotem na ICS. Tak naprawdę mam ten komponent. Ale o ile wiedziałem, był to komponent "TCP/IP", który w zasadzie robi to, co robi Indy/IpWorks. Ostatecznie szukam komponentu, który zarządza połączeniami i zbiorami baz danych w jednym. –

+1

ICS jest odpowiednikiem Indy. Midware to inny produkt dla aplikacji wielowarstwowych, które używają ICS jako warstwy komunikacyjnej. Są to dwa oddzielne produkty od tej samej osoby. :-) –

1

Cóż, będzie to prawdopodobnie wymagać kompletny przepisanie dużo kodu C/S, ale zamiast używać Indy komponentów, zamiast tego możesz spróbować użyć rozwiązania COM +. Zasadniczo można utworzyć składnik COM +, który zostanie zainstalowany na serwerze, a aplikacje klienckie będą łączyć się z tym klientem i bezpośrednio wywoływać funkcje tego komponentu. Będzie miał zarządzanie transakcjami, które będzie obsługiwane przez sam system Windows i to samo dotyczy obsługi transakcji. Technicznie możliwe jest również tworzenie zdarzeń, które umożliwiłyby serwerowi wykonywanie wywołań zwrotnych do klienta, chociaż mogłoby to nieco skomplikować sprawę.
Nie sądzę, aby to rozwiązanie zadziałało prawidłowo, chyba że masz dużo doświadczenia z rozwijaniem COM w Windows i/lub jesteś na tyle odważny, aby spróbować czegoś innego.
W przeszłości miałem podobny problem polegający na tym, że setki klientów musiały łączyć się z jednym serwerem, wykonując wszelkiego rodzaju operacje na bazach danych. Ma stromą krzywą uczenia się, ale ja i mój zespół udało się sprawić, że wszystko działało, a kiedy zrozumieliśmy tę technikę, uzyskaliśmy bardzo stabilne i niezawodne rozwiązanie, dzięki któremu nawet 500 użytkowników jednocześnie robi aktualizacje i inne akcje w jednym. ekstremalny test stresu. Ale znowu klątwa nauki jest stroma, więc może nie być rozwiązaniem, którego szukasz.
(Wciąż jednak COM + będzie korzystać z wielu funkcji wbudowanych w system Windows, takich jak zarządzanie transakcjami, zbieranie baz danych itd.)

+1

Dziękuję bardzo za szczegółową odpowiedź. W rzeczywistości nie mam doświadczenia z COM. Moja wiedza ogranicza się do komponentów delphi i narzędzi innych firm. –

+0

Więc, zapomnij o tym, co tu powiedziałem. COM (i COM +) ma na początku wysoką krzywą uczenia się. Ale gdy zrozumiesz tę technikę, może być naprawdę przydatna, pozwalając na korzystanie ze standardowej funkcjonalności systemu Windows bez potrzeby korzystania z komponentów innych firm! –

Powiązane problemy