Monthly Archives: December 2011

Ćwiczenie w dowolnym języku programowania

Dzisiaj coś z zupełnie innej beczki. Pewnie nie raz rozpoczynaliście zabawę z nowym językiem programowania – niezależnie czy to był Groovy, Scala czy coś poza JVM – Ruby lub Pyton. Zawsze nadchodzi ten pierwszy raz, kiedy po przerobieniu tutoriala/książki/FAQ wypadałoby coś napisać, aby w praktyce przetestować sam język jak i swoją wiedzę.

W przypadku języków, które występują najczęściej w kontekście sieciowym tworzy się coś na kształt bloga, CMSa lub podobnych – prosty CRUD, konfiguracja logowania, zaciągnia zależności i tego wszystkiego. Tutaj niestety problem polega na tym, iż do pracy zaprzęgamy również dedykowany framework – Grailsy, Lifta, RoRa, Django czy co tam jeszcze nam do głowy przyjdzie. Nasz projekt działa, ale czy na pewno do końca rozumiemy język? W dzisiejszych rozwiązaniach otrzymujemy tak wiele rzeczy OOTB, że czasem nawet nie mamy okazji dowiedzieć się co działa pod spodem.

Jeśli takie podejście jest Ci znane – wówczas proponuję inną rzecz. Polecam ten link – jakiś czas temu bawiłem się akcjami (w sensie edukacyjnym – nigdy złotówki nie zainwestowałem) i próba zaprzęgnięcia komputera do dokonywania analiz danych wydawała mi się dość naturalna. Pod wspomnianym linkiem znajduje się algorytm prostego systemu na akcje – czy działa – trudno absolutnie powiedzieć przy dzisiejszej zmienności na GPW. Jednakże jako rzecz do zaimplementowania w nowym języku programowania nadaje się idealnie.

Mamy połączenie z zewnętrznymi zasobami (doczytajcie komentarze), parsowanie pliku tekstowego, rozbicie danych na struktury (listy/zbiory/mapy), pętle i wszystko co potrzebne. Podany system można rozbudowywać – zarówno o własne wariacje algorytmów, jak i o bardziej konkretne  funkcjonalności. Może dodać zapis do bazy danych? Może zapisywać dane inkrementacyjnie we własnym zakresie niż za każdym razem łączyć się po zewnętrzne dane. Dorobić interfejs webowy? Czemu nie. Wiem tylko jedno – da się poćwiczyć.

Jeśli znacie podobne fajne pomysły na ‘programistyczną piaskownicę’ to zachęcam do podzielenia się wiedzą w komentarzach.

Advertisements

Asynchroniczne WebServisy czyli jak przyspieszyć SOAP

Ostatnio w zakładzie dostałem do rozpoznania wolne działanie webserwisu. Problem leżał w tym, iż aplikacje klienckie były w stanie szybciej strzelać pod webserwis niż ten nadążał z procesowaniem. I zasadniczo możnaby rozpocząć szukanie winnego w kodzie gdyby nie prosty fakt, że klasy odpowiadające za webserwis walidowały tylko żądanie po czym pchały obiekt do JMS. Co tutaj można przyspieszyć?

Odpaliłem SoapUIPro i z konkretną dawką testów obciążeniowych udałem się na poszukiwanie winnego. Co się okazało – webserwis był oparty o SOAPa. To jeszcze może nie jest samo w sobie tragiczne – tragicznym natomiast okazało się to, iż pod spodem nasz request potrafił zawierać naprawdę sporą ilość XMLa. Standardowe dane dla każdego requestu to dobre 5 elementów XMLa,  zaś szóstym była lista łańcuchów tekstowych. W 90% ta lista zawierała raptem jeden element – problemem było pozostałe 10%. Wówczas lista rozrastała się do dość solidnych rozmiarów i proces przesyłania tych danych, ich marshallingu, procesowania i takich tam troszkę trwał.  Trzeba było coś z tym fantem zrobić. Przepisanie na RESTa pozostawało w dalszych planach, zaś na szybko udało mi się zorganizować jedną rzecz – wbudowaną w JAX-WS adnotację @Oneway.

 The @Oneway annotation denotes a method as a Web service one-way operation that only has an input message and no output message. Apply this annotation to methods on a client or server Service Endpoint Interface (SEI) or a server endpoint implementation class for a JavaBeans endpoint.

Dodam jeszcze tylko, że adnotowane w ten sposób metody muszą spełniać następujące kryteria:

  • muszą zwracać void
  • nie mogą rzucać wyjątków

Może to być dość ograniczające, np. kiedy rzucony wyjątek w jakiś sposób służy nam do kontroli przepływu po stronie klienta. Jednakże jeśli przy strzelaniu do usługi sieciowej stosujemy metodę fire&forget wówczas jesteśmy w domu. Brak oczekiwania na odpowiedź ze strony serwera – w przypadku przeze mnie opisywanym wstępny przyrost wydajności to około 400%. Myślę zatem, że gra jest warta świeczki.