Avatar billede neo3000 Nybegynder
27. marts 2012 - 14:42 Der er 7 kommentarer og
1 løsning

WCF service - Placeret centralt og på slaver

Hej eksperter,

Jeg er igang med at skulle opbygge en helt ny serverstruktur, hvor jeg har følgende problemstilling:

Jeg har 8 servere i alt:
- 1 central server (med database)
- 7 slaver, der skal kunne udføre jobs

Tanken er, at central-serveren, skal kunne forespørge de 7 servere én efter én, for at finde ud af, om der i øjeblikket kører jobs på dem - Gør der det, forespørges den næste i rækken, indtil der er frit.
Når der er en ledig plads, skal et specielt job kunne startes på serveren, hvor et givent ID definerer hvilket osv.
Efter jobbet er fuldført, skal den pågældende slave svare tilbage til centralen og fortælle at jobbet er færdigt - Hvorefter det data som er hentet ind, kan processeres.

Det er meningen, at jeg skal bruge WCF til dette, for at holde det på et teknisk niveau, hvor det hele kan køre stabilt og jeg med tiden vil kunne tilføje/fjerne servere uden det store besvær.

Som det er lavet pt., så har jeg én applikation, hvor den pågældende applikation startes op, når serveren kører (slave eller central, pt. defineret i app.config).
Det er meningen, at der skal være én WCF-service på alle serverne, som så er tilknyttet så de alle kan tilgå hinandens.

Mit spørgsmål er derfor, hvordan kan jeg bedst lave det sådan, at central-serveren for det første kan spørge på status, og få svar, og hvordan kan central-serveren "diktere" hvad der skal startes op, på en slave?
Jeg formoder, at det må være noget med at subscribe på nogle events på WCF-servicen, men hvordan det lige kan lade sig gøre på den bedste måde, det ved jeg ikke.

Hvis I kan komme med nogle pinpointers, guides eller bare kommentarer, så er jeg mere end glad.


På forhånd tak
Avatar billede janus_007 Nybegynder
27. marts 2012 - 22:35 #1
Hvad med at lave det sådan at slaven poller mainserver efter job istedet med et tidsinterval?

Så behøver du ikke lave en liste over slaveservere som skal itereres igennem på mainserveren.

På mainserveren laver du så en kø af jobs over hvad der skal startes op, du kan evt. bruge Sql Service Broker til det, så har du en styring og kan bare sætte jobs i kø som så afvikles i samme rækkefølge og såsnart der er en ledig slave.
Avatar billede neo3000 Nybegynder
28. marts 2012 - 08:45 #2
Tjo, det kunne jeg godt, men hvordan skulle jeg så få slaveserverne til at starte jobs på centralserveren, når et job er færdigt på dem?
Avatar billede neo3000 Nybegynder
28. marts 2012 - 08:54 #3
Og udover det, hvordan får jeg så listen af jobs?
Hvis jeg poller en service, skal den have listen af jobs fra serveren, dvs. databasen/applikationen.
Det må umiddelbart stadigvæk kræve et kald fra servicen til applikationen.
Avatar billede janus_007 Nybegynder
28. marts 2012 - 11:49 #4
Du skriver "Efter jobbet er fuldført, skal den pågældende slave svare tilbage til centralen og fortælle at jobbet er færdigt - Hvorefter det data som er hentet ind, kan processeres."

Dvs. når jobbet på slaven er færdig så kalder du en WCF på centralen med det pågældende data. Enten igennen WCF.

Listen af jobs findes jo på centralen, så slaven skal blot kalde til centralen "giv mig et job".
Avatar billede neo3000 Nybegynder
28. marts 2012 - 12:12 #5
Det er ikke helt sådan det er tiltænkt.

Det er del af et kæmpe system, som vi kører - Derfor skal det være én central som sender opgaverne ud, for at der ikke skal spørges på den konstant.

Umiddelbart, så er mit problem at se hvordan jeg kan subscribe på et event, som sker i servicen - Og dermed udføre det valgte job, på den pågældende slave.

Hvordan gøres det lettest?
Avatar billede janus_007 Nybegynder
28. marts 2012 - 18:24 #6
Jeg har i mit tidligere job siddet i en lignende problemstilling, der havde vi nogle lokale sql-servere som modtog data fra den respektive "slave", "slaven" spurgte så på localsql og eksekverede herefter. Mainserveren kunne kommunikere med "slave-sql'erne" igennem linked servers. Måske det inspirerer lidt :)

At sende opgaverne ud kræver jo at centralserveren ved om slaverne arbejder, ik sandt? Så alligevel skal der polles(en efter en, skriver du selv) fra serveren og ud.
Derfor er arkitekturen med at slaven spørger lidt bedre imho, når den kører spørger den jo ikke.
Det er også risikabelt at forvente at slaven kan skrive en status til mainserveren om at den er klar, meget kan gå galt og du kan stå med 7 slaver som serveren opfatter som kørende men i virkeligheden holder stille.

Jeg synes selv arkitekturen med en kø (service broker) på mainserveren og så de 7 slaver som spørger, virker som det mest stabile og nemmeste at udvide.
Hvad kan du ikke li ved det?
Avatar billede arne_v Ekspert
02. april 2012 - 04:40 #7
Hvis du vil bruge modellen med push fra central til slave, saa vil jeg mene at du skal:
1) koere job paa slaver asynkront (egen traad eller lignende)
2) have slave expose nogle web services:
      bool ReadyForNext()
      void StartNewWork(Data obj)
  som begge returnerer med det samme.
3) central maintainer liste over jobs
4) to muligheder for at maintaine liste med slaver
  a) hardcoded (hvis det sjaldent aendrer sig saa kan det vaere helt fint)
  b) client selv registrerer sig ved start via web service paa central og central fjerner dem ved fejl i kald under #2
Avatar billede arne_v Ekspert
02. april 2012 - 04:44 #8
Men jeg synes nu ogsaa at pull modellen lyder tiltraekkende.

1) central sender til en "out" message queue (hvis det ikke er SQLServer centric saa vil jeg ikke bruge service broker, men en standard message queue)
2) clients receiver fra den message queue
3) client koerer job
4) client sender done til "in" message queue
5) central receiver status fra den message queue
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester