Komunikacja między modułowa oparta o komunikaty w formacie XML.

0

Cześć !

W pracy udało mi się dołączyć do zespołu tworzący dość duży i skomplikowany system. Zanim się wdrożę, chciałbym mieć własne przemyślenia i trochę większy pojęcie o temacie.
Mam stworzyć jeden z modułów ( jakie jest jego zadanie, nie jest do końca ważne ), który będzie się komunikował z w/w systemem.

Z tego co się dowiedziałem, komunikacja jest oparta o transmisje wiadomości w formacie XML, o różnych formatach, z różnymi danymi.

Technologią jest .NET, sam będę pisał w C#.

Chciałbym Was na początku zapytać o trzy rzeczy :

1 ) Skoro wiadomości mogą mieć różną formę ( nagłówek wiadomości XML jest stały ), to jak w elegancki sposób można zapewnić sobie ich parsowanie ? Kiedy system się bardziej rozwinie, a wiadomości może dojść jeszcze wiele nowych, chciałbym od razu przemyśleć rozwiązanie które zapewni w miarę szybką możliwość ich obsługi. Może należałoby trzymać szablony tych wiadomości XML gdzieś zewnątrz ?

Czy znacie może jakiś artykuł, albo możecie nakierować w stronę którą powinienem obrać ?

2 ) Sam system daje możliwość nasłuchiwania nowych wiadomości, odbierania ich i interpretowania. Tutaj pojawia się kolejne pytanie architektoniczne. W tym celu obok głównej aplikacji należy stworzyć dodatkowy wątek, który będzie tylko nasłuchiwał tego „mailboxa”, i w razie wykrycia wiadomości kierowanej do nas, przekaże do głównego wątku w którym będzie interpretowany. Mam rację ?

3 ) Ostatnią rzeczą, jest sposób napisania aplikacji której działanie opiera się na zasadzie pytanie/odpowiedź. Już tłumacze o co chodzi .

Scenariusz działania modułu, zwykle opiera się o taki dialog:

  1. Moduł : Mogę wejść do domu ?
  2. System : Możesz
  3. Moduł : To daj mi klucze
  4. System : Proszę
  5. Moduł : Użyłem, i oddaje.

Czyli aby wykonać jakąś akcję, najpierw należy wymienić parę informacji z samym systemem.
W tym miejscu też chciałbym się wspomóc Waszym doświadczeniem. Możecie mnie nakierować w dobrą stronę ? Jak dobrać odpowiednią architekturą rozwiązania takiego problemu ?

Pozdrawiam serdecznie wszystkich !

0

1 ) Skoro wiadomości mogą mieć różną formę ( nagłówek wiadomości XML jest stały ), to jak w elegancki sposób można zapewnić sobie ich parsowanie ? Kiedy system się bardziej rozwinie, a wiadomości może dojść jeszcze wiele nowych, chciałbym od razu przemyśleć rozwiązanie które zapewni w miarę szybką możliwość ich obsługi. Może należałoby trzymać szablony tych wiadomości XML gdzieś zewnątrz ?

Najlepiej byłoby, gdyby wszystkie typy wiadomości były opisane jako XML Schema. Wtedy czeka cię najmniej roboty w ich parsowaniu. Wrzucasz taką Schemę do odpowiedniego generatora klas, który wypluje ci odpowiedni model, a .NET na podstawie Schemy zwaliduje i sparsuje XML.

2 ) Sam system daje możliwość nasłuchiwania nowych wiadomości, odbierania ich i interpretowania. Tutaj pojawia się kolejne pytanie architektoniczne. W tym celu obok głównej aplikacji należy stworzyć dodatkowy wątek, który będzie tylko nasłuchiwał tego „mailboxa”, i w razie wykrycia wiadomości kierowanej do nas, przekaże do głównego wątku w którym będzie interpretowany. Mam rację ?

Tak. Dodatkowo, wrzuca się wszystkie przychodzące wiadomości do kolejki, z której inny wątek zdejmuje je i dopiero podejmuje odpowiednie działania.

Ad. 3. Tutaj obrana strategia już zależy od specyfiki samej aplikacji, np. od tego ile różnych działań ma podejmować, czy chcesz swoją aplikację podzielić na jeszcze kilka mniej lub bardziej niezależnych modułów czy mają mieć jakieś stany i tak dalej.

0

Dobry avatar Rev !

( 1 )

Dzięki za podpowiedzi, i tak chyba też zrobię. Czy mówisz o jakimś tool’iku dostępnym z poziomu Visual'a ? Czyli na podstawie gotowej schemy, zostanie wygenerowana klasa której później można użyć podczas deserializacji, tak ? To miałeś na myśli ?

Zastanawiam się nad pewnym problem mogącym tu wystąpić, mianowicie interpretacja takim sposobem każdej wiadomości musiałaby polegać na porównaniu jej z każdym możliwym wygenerowanym modelem. Czyli próbą deserializacji za pomocą każdej dostępnej schemy, i sprawdzania rezultatu.

Czy może kiedy pisałeś o zwalidowaniu, to miałeś na myśli właśnie mechanizm który pozwala najpierw sprawdzić czy dana wiadomość będzie pasować do wzorca ?

( 2 ) Chyba rozumiem. Czyli w tym wypadku mielibyśmy aplikację 3 wątkową :

  • Odbiór wiadomości i odłożenie jej na stos
  • Pobranie wiadomości ze stosu, parsowanie i przekazywanie gotowego obiektu do głownego wątku
  • główny wątek

( 3 )

Tutaj nie jestem w stanie przewidzieć co będzie kiedyś, ale trzeba założyć, że taka „rozmowa” trwa min dwa komunikaty dla akcji( jedno pytanie, jedna odpowiedź ). I raczej jestem pewien, że ilość komunikatów dla konkretnej akcji będzie stała.

Mogą dojść kolejne akcje które moduł ma realizować, ale będą posiadać z góry określoną ilość komunikatów które trzeba wykonać, i ta liczba się już raczej nie zmieni.
I kurcze nie bardzo wiem, jak się do tego zabrać. Może rzeczywiście jakaś forma maszyny stanowej ?

Dzięki za udział w dyskusji!

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