Ping Ring del 1: Introduksjon

Dette er starten på en artikkelserie jeg har kalt Ping Ring. Jeg skal lage et program for å overvåke at et sett med servere er i live, og gjennom en rekke blogposter vil du få se det samme programmet implementert i et utall programmeringsspråk: C#, Ruby, Clojure, Erlang med flere.

Målet er å studere og demonstrere ulikhetene mellom språkene. I hvilket språk er det enklest å implementere programmet? Hvilken implementasjon er lettest å forstå? Følg med over de neste par ukene, og du vil kanskje finne svaret.

Oppgaven: Overvåking av servere

Se for deg at du har en haug med servere som du ønsker å vite at er operative – at de kjører, og er tilgjengelige på nettverket. En mulig strategi er å installere et lite program på hver server som sende et lite ping i en ring, som i figuren nedenfor.

pingring1

Om en server faller ut, vil ringen bli brutt. Dette vil man kunne oppdage to steder: Programmet som forsøker å pinge serveren som er ute vil ikke kunne opprette kontakt, og serveren etter den som er ute i ringen vil slutte å motta pings. Disse serverne kan da trigge en alarm og fortelle driftsteamet hvilken server som er nede.

pingring2

Jeg har valgt denne oppgaven fordi den ikke er så veldig vanskelig å implementere, selv om jeg må bruke noen teknikker som ikke dukker opp så veldig ofte i vanlig applikasjonsutvikling. For å løse oppgaven vil jeg bruke tråding/samtidighet, og low-level socket/TCP-kommunikasjon. Dette vil kunne vise interessante ulikheter i de ulike språkene. Programmet krever derimot ingen komplekse algoritmer eller data-hierarkier, som ville kunne gjøre det spesielt fordelaktig å bruke en bestemt klasse programmeringsspråk (som OOP vs. FP).

Detaljert spesifikasjon

Først noen begrensninger: Jeg kommer bare til å simulere at jeg har mange servere, så alle vil kjøre på localhost. Hver instans vil dermed bli identifisert med en port, og kan anta at all komunikasjon går på IP 127.0.0.1. Programmet skal kjøres som en konsoll-applikasjon, og tar fire parametre: (1) egen port, (2) porten til den neste serveren i ringen, (3) hvor mange sekunder det kan gå uten en ping før alarmen skal aktiveres, og (4) en indikator for om programmet skal starte med en ping (én av serverne må starte opp ringen).

Og for enkelhets skyld vil det å aktivere alarmen bare være å skrive en melding til konsoll-vinduet.

Programmet vil bestå av følgende, funksjonelle deler:

design Ping-sending:

Programmet må kunne sende en ping til en bestemt port (den neste serveren). Et ping består av teksten “Ping from X”, hvor X er porten det sendes fra. Sendingen skal skje fra en egen tråd, slik at det ikke påvirker programmets øvrige oppgaver. Programmet skal alltid vente ett sekund før ping sendes – vi må ikke overbelaste nettverket/serverne med pings.

Hvis den neste serveren i rekken er nede skal pingen feile, og programmet skal da melde fra om dette til konsollet.

Ping-mottak:

Programmet skal lytte på sin egen port etter pings. Pings skal mottas og behandles i en egen tråd, slik at det ikke påvirker programmets øvrige oppgaver. Når en ping mottas skal meldingen skrives til konsollet, og en ping skal sendes videre til neste server.

Ping-overvåking:

Programmet skal ha en egen tråd som i et bestemt intervall, for eksempel hvert femte sekund, kontrollerer at serveren mottar pings. Hvor mange sekunder serveren kan stå uten å motta pings er ett av oppstartsargumentene. Hvis denne grensen overskrides skal programmet skrive en alarm til konsollet som sier hvor mange sekunder det har gått siden siste ping ble mottatt. Det skal også sendes en ny ping for å forsøke å vekke ringen til live igjen.

Oppstart:

Under oppstart skal programmet lese inn argumentene og starte opp de nødvendige trådene. Det skal også identifisere seg ved å skrive ut sin egen port til konsoll-vinduet. Og hvis det siste argumentet er “true” skal det sendes en initiell ping for å starte opp ringen.

Og hva kommer nå?

Som jeg sa i starten skal jeg implementere dette programmet i en rekke, ulike programmeringsspråk. Vi kan forestille oss at vi har en overivrig systemansvarlig som nekter oss å kjøre annet enn C#-kode på C#-serveren, Ruby-kode på Ruby-serveren osv., og at vi derfor MÅ implementere mange varianter :P

Jeg kommer til å poste artiklene i rask rekkefølge, så følg nøye med i en uke eller to fremover.

Hvis du har lyst til å forsøke deg på en implementasjon selv kan det være lurt å gjøre det før du ser noen av mine implementasjoner.., så kan du i stedet sammenligne etterpå. I så fall er det kult om du gjør implementasjonen din tilgjengelig på pastie, CodeTidy, mysticpaste, Gist eller en annen pastebin, og deler linken med oss andre i en kommentar.

Kategorier: Diverse prosjekter, Polyglot.
RSS feed for kommentarene. Tilbaketråkk.

6 kommentarer til “Ping Ring del 1: Introduksjon”

  1. Odd Rune Says:

    Ehh.. Nagios?

  2. Torbjørn Says:

    Ehh.. Nei! ;)
    Regnet ikke med at ideen min var orginal, men PingRing er nå i alle fall et mye kulere navn!

  3. Ping Ring del 3: Ruby Says:

    [...] Dette er del 2 i artikkelserien Ping Ring hvor jeg implementerer et og samme program i et utall ulike programmeringsspråk – for å se om det er noe å lære gjennom å gjøre det. Introduksjonen kan du lese her. [...]

  4. Ping Ring del 2: C# Says:

    [...] Dette er del 2 i artikkelserien Ping Ring hvor jeg implementerer et og samme program i et utall ulike programmeringsspråk – for å se om det er noe å lære gjennom å gjøre det. Introduksjonen kan du lese her. [...]

  5. Ping Ring del 5: Erlang Says:

    [...] Dette er del 5 i artikkelserien Ping Ring hvor jeg implementerer et og samme program i et utall ulike programmeringsspråk – for å se om det er noe å lære gjennom å gjøre det. Introduksjonen kan du lese her. [...]

  6. Ping Ring del 7: Clojure m/Agenter Says:

    [...] Dette er del 7 i artikkelserien Ping Ring hvor jeg implementerer et og samme program i et utall ulike programmeringsspråk – for å se om det er noe å lære gjennom å gjøre det. Introduksjonen kan du lese her. [...]

Skriv en kommentar

Tillatte tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Einar W. Høst: Det er jo læringen som gjør det morsomt! Se også http://norvig.com/21-days...

Pagliacci: OBS! tl;wr. Det er vel akuratt det jeg sliter med med min læring innenfor pr...

Torbjørn: La oss anta to ulike definisjoner av Template Method pattern - de to ytterpunkte...

Lars-Petter: Hei igjen. Siden du inviterer til å ta diskusjonen i bloggen, og har tatt deg t...

Torbjørn: Lars-Petter: Det er én måte å se det på. Det er absolutt fortsatt Template M...

Lars-Petter: Hei. Har du ikke i prinsippet her gått over fra Template Method (arv) til Strat...

Christian Abildsø: I alle fall i C#, så føles dette som kode som blir mer fleksibel men vanskelig...

Torbjørn: Hei Henrik, og takk for tilbudet. Ble oppmerksom på Rasberry Pi for under en uk...

Henrik Sandaker Palm: Ang. større hobby prosjekt. Du er som er en slik rakker på programmering har j...

Øivind Nilsen: Slutt å bruke mobilnummeret mitt som eksempel !...

Mulig relaterte linker

 Hold deg oppdatert

Søk i bloggen

Ferske innlegg

  • En historie om programmering
  • Template Method del 4: Multippel arv
  • Template Method Intermesso
  • Template Method del 3: Bare funksjoner
  • Kategorier

  • .net ninja (37)
  • Bøker (17)
  • Diverse prosjekter (35)
  • DSL (10)
  • Erlang (10)
  • F# (5)
  • Hardware (1)
  • Jobb (77)
  • Julekalender (51)
  • kjempekjekt.com (23)
  • LISP/Clojure (33)
  • NNUG / community (60)
  • O/RM & databaser (10)
  • Off topic (116)
  • OO-design/clean code (30)
  • Podcasts (14)
  • Polyglot (77)
  • Ruby (27)
  • Silverlight / RIA (3)
  • Software/verktøy (20)
  • Softwareutvikling (21)
  • Testing / TDD (30)
  • the contiki strip (13)
  • User experience (3)
  • WCF (3)
  • Webutvikling (32)
  • WPF (9)
  • WTF (12)
  • Last ned Wallpaper

    Programmeringsbloggens tøffe skrivebordsbakgrunn med snippets fra ulike språk laster du ned her!

    Abonner via epost

    Om du vil kan du få alle nye blogposter tilsendt til din epost. Abonner nå, det er kjempeenkelt!

    Meta