Jeśli mam zamiar wprowadzić program do produkcji, jest kilka rzeczy, które muszę zrobić, aby program mógł zostać uznany za „zoperacjonalizowany” - to znaczy działający i możliwy do utrzymania w sposób mierzalny i weryfikowalny zarówno przez inżynierów, jak i personel operacyjny. Dla moich celów zoperacjonalizowany program musi:
- Móc logować się na wielu poziomach (np. Debugowanie, ostrzeżenia itp.).
- Umiejętność gromadzenia i udostępniania metryk / statystyk dotyczących rodzajów pracy wykonywanej przez program i czasu jej trwania. Idealnie byłoby, gdyby zebrane metryki były dostępne w formacie zgodnym z powszechnie używanymi narzędziami do monitorowania, takimi jak Ganglia , lub można je w ten sposób zmienić.
- Być konfigurowalne, najlepiej za pośrednictwem systemu, który umożliwia aktualizację skonfigurowanych właściwości w uruchomionych programach bez ponownego uruchamiania programów.
- Możliwość wdrożenia na zdalnych serwerach w powtarzalny sposób.
W świecie Scala istnieją dobre biblioteki, które radzą sobie z co najmniej trzema pierwszymi wymaganiami. Przykłady:
- Logula do logowania.
- Metrics lub Struś do zbierania i raportowania metryk.
- Configgy lub Rys. Do konfiguracji.
Jeśli chodzi o wdrażanie, jednym podejściem przyjętym w świecie Scala jest połączenie kodu bajtowego i bibliotek, które składają się na program z czymś w rodzaju assemblera-sbt , a następnie wysłanie powstałego pakietu („grubego JAR”) na zdalne serwery za pomocą narzędzia takiego jak Capistrano który wykonuje polecenia równolegle przez SSH. Nie jest to problem, który wymaga narzędzi specyficznych dla języka, ale jestem ciekawy, czy takie narzędzie istnieje w społeczności Haskell.
Prawdopodobnie istnieją biblioteki Haskell, które zapewniają cechy, które opisałem powyżej. Chciałbym wiedzieć, które z dostępnych bibliotek są uważane za „najlepsze”; to znaczy, które są najbardziej dojrzałe, dobrze utrzymane, powszechnie stosowane w społeczności Haskell i stanowią przykład najlepszych praktyk Haskell.
Jeśli istnieją inne biblioteki, narzędzia lub praktyki związane z przygotowywaniem kodu Haskell do produkcji, chciałbym również o nich wiedzieć.
Odpowiedzi:
To świetne pytanie! Oto pierwsze cięcie.
hslogger to z pewnością najpopularniejszy framework do logowania.
Nie znam żadnych standardowych narzędzi raportowania, jednak wyodrębnianie raportów ze
+RTS -s
strumieni (lub poprzez profilowanie flag wyjściowych) było czymś, co robiłem w przeszłości.Możesz to również uzyskać w formacie do odczytu maszynowego:
Idealnie byłoby podłączyć się do działającego środowiska wykonawczego GHC przez gniazdo i spojrzeć na te statystyki GC interaktywnie, ale obecnie nie jest to super łatwe (potrzebne są powiązania FFI z interfejsem "rts / Stats.h"). Możesz dołączyć do procesu przy użyciu
ThreadScope
i monitorować zachowanie GC i wątków.Podobne flagi są dostępne dla przyrostowego, rejestrowanego profilowania czasu i przestrzeni , które można wykorzystać do monitorowania (np. Te wykresy mogą być budowane przyrostowo).
hpc
zbiera wiele statystyk dotyczących wykonywania programu, poprzez jegoTix
typ, a ludzie napisali narzędzia do rejestrowania według przedziału czasu, jaki kod jest wykonywany.Dostępnych jest do tego kilka narzędzi, możesz przeładować stan w stylu xmonad; lub przejdź do kodowania hotswapping poprzez
plugins
pakiety * lubhint
. Niektóre z nich są bardziej eksperymentalne niż inne.Niedawno wydany Galois
cabal-dev
, który jest narzędziem do tworzenia odtwarzalnych kompilacji (tj. Zależności są określane i kontrolowane).źródło
EventLog
struktura rejestrowania GHC (używana+RTS -l
w czasie wykonywania) przesyła dane wyjściowe do pliku, który można wizualizować za pomocą dowolnego narzędzia odczytującego format dziennika zdarzeń.Przykład pliku ConfigFile:
źródło
Powtórzę wszystko, co powiedział Don, i dodam kilka ogólnych rad.
Na przykład dwa dodatkowe narzędzia i biblioteki, które warto rozważyć:
-Wall
Oba są ukierunkowane na jakość kodu.
W ramach praktyki kodowania unikaj Lazy IO. Jeśli potrzebujesz przesyłania strumieniowego we / wy, skorzystaj z jednej z iteracyjnych bibliotek, takich jak moduł wyliczający . Jeśli spojrzysz na Hackage , zobaczysz biblioteki, takie jak http-enumerator, które używają stylu modułu wyliczającego dla żądań http.
Jeśli chodzi o wybieranie bibliotek podczas hakowania, czasami może pomóc przyjrzenie się, ile pakietów zależy od czegoś. Łatwo zobacz odwrotne zależności pakietu, którego możesz użyć na tej stronie internetowej, która odzwierciedla hakowanie:
Jeśli aplikacja kończy się w ciasnych pętlach, jak serwer WWW obsługujący wiele żądań, lenistwo może być problemem w postaci wycieków przestrzeni. Często jest to kwestia dodania adnotacji dotyczących ścisłości w odpowiednich miejscach. Profilowanie, doświadczenie i rdzeń czytania to główne techniki, które znam w walce z tego typu rzeczami. Najlepszym odniesieniem do profilowania, jakie znam, jest rozdział 25 książki Real-World Haskell .
źródło