Multi-threaded Windows Service - Erlang

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal fortælle det problem, jeg skal løse, og jeg har brug for nogle forslag, hvis jeg er på den rigtige vej.


Problemet er:


Jeg skal oprette et Windows Service-program, der modtager en anmodning og gør noget. (Socket Communication) Denne handling er at udføre et script (måske i Lua eller Perl) .Dette script modellerer forretningsregler for klienten, forespørger i databaser, gør anmodning på hjemmesider og derefter sender et svar til klienten.


Der er 3 obligatoriske krav:



  1. Tjenesten modtager meget anmodning på samme tid . Så jeg synes at bruge arbejdstagerens trådmodel.

  2. Tjenesten skal have en høj gennemgang . Jeg vil have mange af anmodninger på samme sekund.

  3. Lav latens : Jeg skal reagere meget hurtigt på disse anmodninger.



Hver anmodning vil generere en logbog. Jeg kan ikke skrive disse logfiler i den fysiske disk samtidig med at scripts udføres på grund af den store I/O-tid. Sandsynligvis vil jeg lave en kø i hukommelsen, og andre tråde vil forbruge denne kø og skrive på disk.


I fremtiden er det muligt, at to wokers tråd skal ændre meddelelser.


Jeg skal lave en protokol til denne service. Jeg tænkte på at bruge sparsommelighed, men jeg ved ikke det omliggende involveret. Måske vil jeg lave min egen protokol.


At skrive windows service tænkte jeg i Erlang. Er det en god idé?


Har nogen forslag til at løse dette problem? Hvilket sprog er det bedre at skrive denne tjeneste?

Bedste reference


Ja, Erlang er et godt valg, hvis du kender det eller er klar til at lære. Med Erlang behøver du ikke nogen arbejdstråd, bare implementer din server i Erlang-stil, og du vil automatisk modtage multithreaded-løsning.


Ikke sikker på, hvordan man konverterer Erlang program til Windows-service, men nok det er muligt.


At skrive til samme logfil fra mange tråde er suboptimal, fordi det kræver låsning. Det er bedre at have en log-entry-kø (låsfri?) Og en separat tråd (Erlang proces?), Der skriver dem til filen. BTW, er du sikker på, at eksekvering af eksternt script på et andet sprog er meget hurtigere end at skrive en log-record til filen?


Det er tvivlsomt, at du får meget bedre ydeevne med dit eget serialiseringsbibliotek end Thrift giver gratis. En anden mulighed er Google-protokollabuffere , nogen hævdede, at det er hurtigere. [1]


Teoretisk (!) Er det muligt, at Erlang-løsningen ikke giver dig den nødvendige præstation. I dette tilfælde overveje et kompilérbart sprog, f.eks. C ++ og asynkron netværk, f.eks. Boost.Asio . Men vær klar til at det er meget mere kompliceret end Erlang måde. [2]