sigsys|dk


Blog om udvikling

Om

Jeg forsøger i min fritid at åbne mine øjne og lære om nye teknologier. Nogen teknologier går jeg i dybden med, mens jeg med andre kun lige studser overfladen. Da jeg i mit professionelle job også kommer rundt om meget, har jeg efterhånden kigget på mange spændende ting. Et "næste fyldestgørende" udsnit kommer her:

  • WCF
  • Mono
  • Mono.Cecil
  • windbg
  • MSSQL
  • Mongo database
  • Solr
  • ElasticSearch
  • CouchDb
  • RavenDB
  • MVC
  • Windows Phone udvikling (er pt ved at lave min egen Twitter klient)
  • Knockout
  • TypeScript
  • Bootstrap
  • Rabbitmq
  • LogStash
  • Kibana

Mange af disse teknologier, afprøver jeg i mit kære blogsystem, som leverer dette indhold.

Platformen

Mine mål for platformen er:

  • Platformen skal være skalerbar.
  • Platformen skal kunne hostes i Azure
  • Client administration skal skrives i WPF. INGEN web administrationsinterface!!!
  • Artiklerne skal skrives i markdown.
  • Brugerhåndteringen foregår via Windows' indbyggede brugerhåndtering eller Active directory.

Alle, undtagen brugerhåndteringen, er pt opfyldt. Jeg har lige nu hardcoded en bruger ind, indtil jeg finder ud af, hvordan jeg sætter WCF sammen med mit Azure AD. Jeg har bygget den specielt med Azure for øje. Derfor har jeg brugt lidt tid på at sætte mig ind Azure infastrukturen, hvilket jeg har fundet meget spændende. Jeg troede i første omgang at det var bare var noget der skulle overståes, men jeg må kravle til korset, og indrømme at jeg fandt det ekstrem spændende, at sidde og bygge op. Platformen er derfor bygget således:

  • En VM håndterer databasen
  • En VM, med en WCF service, som via IIS WAS featuren, sørger for at levere indhold til websitet, og håndterer oprettelse, sletning, søgning og opdatering af artikler, via administrationsklienten.
  • en VM, med en IIS, sørger for at servere blog indholdet

Disse er placeret tæt på hinanden i Azure via et virtuelt netværk. Mit initielle valg af database var en embedded RavenDB, dog gik jeg væk herfra da jeg fandt at der manglede dokumentation. Det virkede også som om at det var svært at lave en dedikeret database løsning. Efterfølgende fandt jeg CouchDB, og jeg har ikke fortrudt! Denne database passer perfekt ind i min infastruktur, da jeg med denne database kan skalere. Til administrationssøgnig har jeg tilmed sat en ElasticSearch database op. Enkel og ligetil! Jeg havde regnet med at skulle bruge meget mere tid på at komme igang, men dokumentationen var så brugervenlig, at jeg havde søgningsmuligheder efter 20 minutter. I fremtiden vil jeg lave en frontendsøgning, til selve bloggen via Azure Search, for at rode lidt med denne teknologi.

Jeg bruger WCF til at styre CRUD operationerne fra administrationsklienten.

Jeg har prøvet at lave setuppet således at man nemt kan skalere op. Man burde nemt kunne tilføje en ekstra database, og konfigurer master/slave eller et andet setup (jeg mener Couchdb understøtter andre setups. Correct me if I am wrong!). Man burde nemt kunne sætte en Load Balancer med round robin op foran webrollerne som servere websitet og proppe ekstra roller på, som kan servere indholdet (hvis man skal have udgives i flere regioner). Dette gælder også for administrationssiden. Man kan skalere op med flere webroller som servere WCF servicen (dog uden LB'eren). Jeg skal ikke kunne sige om dette er den perfekte setup, men ved at rode med Azure har jeg fået øjnene op for mulighederne som ligger i denne platform, og jeg må sige at jeg godt kan lide det! Jeg kan klart anbefale at gå lidt i dybden med det, hvis man sidder og mangler et fritidsprojekt.

Webdelen bliver styret via MVC, bootstrap og javascript. Min client side domæne logik skriver jeg i TypeScript. Et fint sprog som oversættes til javascript, som browseren kan læse. Jeg har prøvet at skrive webdelen så flest mulig kan tilgå den. Det vil, har du ikke javascript aktiveret, eller er du en crawler, så skal du kunne få serveret indholdet. En process, som er ongoing og som man aldrig bliver helt færdig med at teste, men meldt endelig ind, hvis du har fundet en fejl! Jeg prøver at teste hver opdatering, så grund som overhovedet muligt.

Som det nyeste, har jeg også sat en rabbitmq server op, som via et http modul, smider exceptions og http requests ned i en lokal rabbitmq queue. På database siden, har jeg ligeledes sat en rabbitmq server op, med en tilhørende kø. Disse to queues er bundet sammen via federation, hvor jeg har logstash, på database side, sat op til at smide exception logs og http logs ind i elasticsearch, hvorefter jeg kan bruge Kibana, til at lave et dashboard, som kan give mig et overblik over, hvor mange requests der kommer pr. dag, hvad side der er mest efterspurgt, og hvor mange fejl jeg har fået. Jeg kan ligeledes se useragents osv. Alt sammen meget behageligt. Dette setup har jeg lavet, for at se hvad der sker på mit website, og for at komme af med GA eller MS Insights.

Desuden er jeg ved at udvikle en klient, som kan udtrække informationer omkring http requests, og de fejl som sker på siden. Lige pt. gemmer jeg alle http requests og fejl i elasticsearch, og viser statistikker udfra disse i nogle dashboards. Ydermere er jeg ved at lave en klient, som kan notificere mig når der sker noget på siden, fx en fejl eller det at en bruger klikker sig rundt.