[WCF] Architectuur

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Ik ben een pub/sub mechanisme aan het bouwen in WCF. Ik heb een basis voor een architectuur staan maar vraag me af of dit "the way to do it" is of dat er betere oplossingen bestaan.

Het doel van het systeem is alsvolgt: er zijn een hoop clients die verbinding maken met een centrale server. Een client moet events kunnen publishen en andere clients moeten zich kunnen subscriben. Dit is nog allemaal makkelijk te verwezenlijken en er is hierover op msdn zelfs een voorbeeld van de patterns en practices group (http://msdn.microsoft.com/en-us/library/ms752254.aspx). Het wordt echter wat complexer in mijn situatie omdat de clients in groepen onder te verdelen zijn, en iedere client die zich subscribed op een bepaald event wil alleen geinformeerd worden als dat event wordt gefired wordt door een andere client van zijn eigen groep. Hier is waar het pattern van ms failed want zij gebruiken een static event in de service. Ik kan dit pattern gaan misbruiken maar dan kom ik meteen een paar nasty dingen tegen:
1. Ik moet dan in de event args gaan opnemen voor welke group clients dit event getriggered wordt. Dus als ik 300 clients heb en het event is maar voor 3 clients bedoeld gaan er 297 handlers voor niks af in de service.
2. Alle clients moeten automatisch hetzelfde contract implementeren omdat ze allemaal naar dezelfde service connecten. In mijn situatie heb ik clients met verschillende contracten die echter toch naar dezelfde events luisteren. Ik moet dan alle contracten mergen in 1 contract en iedere client heeft nu een berg functies tot zijn beschikking die eigenlijk niet van toepassing zijn voor hem.
3. Er is geen enkele manier om state te persisten. De clients slaan een reference naar de callback op, maar als de server een keer plat gaat is al die state verloren en kan die alleen door de clients zelf weer opnieuw geinitieerd worden.

Al met al leek me dit niet ideaal dus heb ik het anders opgelost. Iedere client connect met een service en houdt een sessie aan met die service (over een NetTcpBinding). De service slaat dan weer een reference naar de callback op (tot aan hier is alles dus nog hetzelfde als het p&p voorbeeld van ms), evenals de groep waarbij de client behoort en een uniek id van de client. Daarnaast heb ik een extra service in het leven geroepen die de events routeert. De instances van de andere services kunnen dan subscriben, unsubscriben en events publishen via deze eventing service die dan weer bepaald welke call bij wie geinvoked moet worden.

Wat ik me afvraag is of ik goed omga met de instancing modes van de services. De clients die met hun services verbinding houden moeten dit in een sessie doen. De eventing service moet een singleton zijn. De event receivers op de andere services moet ik ook een singleton maken omdat dat de engie manier is om het event ook bij dezelfde instance te ontvangen i.p.v. dat er een nieuwe wordt gespawned (met de parameterless constructor, en waarbij ik dus geen referentie naar het callback channel van de client heb). Ik heb dus een service, met een InstanceContextMode die PerSession is, die vervolgens weer een child object heeft (de event receiver) die een InstanceContextMode Single heeft.

Is dit design-technisch gezien een nette oplossing wat ik hier heb of is er iets beters te verzinnen? (Ik heb 1 vertical slice geprogrammeerd als PoC en dat werkt prima overigens)

Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

Weet je zeker dat WCF hier het handigste voor is? Mij lijkt dit meer iets om over sockets te gooien ipv. webservices.

Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Vraag 3:

Er is inderdaad geen manier om je registraties persistent te maken. Het is niet mogelijk om vanuit de service opnieuw de verbinding met de client op te zetten. Niet geheel verwonderlijk natuurlijk als je bedenkt wat de technische implicaties daarvan zouden zijn.
Maar dit houdt dus in dat je een keep-alive patroon moet implementeren waarbij de client zelf de status van zijn verbinding controleert en opnieuw opbouwt indien nodig.

Met betrekking tot je keuzes in InstanceContextMode. Gezien de limitiaties waarmee je werkt (niet mogelijk op een nette manier om callback references naar een andere service door te geven) is dit zelfs de enigste combinatie die mogelijk is.
Maar je gaat tegen de volgende dingen aan lopen:

- Hoe meer events er gepubliceerd worden hoe langer het gaat duren voor je service om deze te verwerken.

- Vergeet niet om de default session timeout voor de verbinding met je event registratie service te verhogen. Als je clients bv 10 min staan te idlen dan verloopt de sessie automatisch. Weet even niet welke timeout setting dit precies was maar ik zal het straks even opzoeken.

- Wat ga je doen als je nieuwe event types wilt toevoegen? Momenteel zorgt dit ervoor dat je AL je clients moet updaten, of je moet versioning gaan toepassen, maar ook dat lijkt me niet ideaal.

- Je zult nogal wat scaffolding code moeten gaan schrijven voor het afvangen van clients welke niet meer verbonden zijn (om wat voor reden dan ook). Tevens zullen de clients regelmatig een keep alive bericht naar de service moeten sturen om te kijken of ze nog wel verbonden zijn, wat weer extra load oplevert. Het controleren van de proxy state property is namelijk niet voldoende om te bepalen of je verbinding nog leeft. Dit hoef je overigens niet via het callback contract te doen. Client en server communiceren heen en weer over dezelfde verbinding (vanuit wcf gezien dan).

Pub/Sub over tcp-ip in dit soort scenario's is lastig ongeacht welke techniek je gebruikt. WCF maakt het implementeren ervan makkelijker met callback contracts e.d. Maar dit neemt de problematiek van wat je probeert te doen nog niet weg.

Ikzelf heb het in ieder geval al meerdere malen gedaan en ik gebruik hiervoor wcf ook niet meer. Ik gebruik het callback contract concept alleen nog maar voor relatief kort lopende communicatie patronen. Maar zeer zeker niet voor pub/sub in de vorm die jij beschrijft. Teveel inherente problemen waardoor het zeer lastig is om een stabiel geheel neer te zetten.
Ik ben hiervoor overgestapt naar MSMQ i.c.m NServiceBus. Hiermee heb je de volgende voordelen:
- Het is mogelijk om subscriptions te persisten. Je hebt immers alleen het adres van de client nodig.
- Als de client even niet bereikbaar is worden events in de queue opgeslagen om te wachten tot dat de client er weer is.
- Als je nieuwe event messages wilt introduceren hoef je alleen maar een nieuwe message type te implementeren en te zorgen dat je clients iets gaan doen met dat bericht. Geen aanpassing is nodig in je service infrastructuur.

Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 11-09 14:44
D-Raven schreef op dinsdag 07 september 2010 @ 09:52:
Ikzelf heb het in ieder geval al meerdere malen gedaan en ik gebruik hiervoor wcf ook niet meer. Ik gebruik het callback contract concept alleen nog maar voor relatief kort lopende communicatie patronen. Maar zeer zeker niet voor pub/sub in de vorm die jij beschrijft. Teveel inherente problemen waardoor het zeer lastig is om een stabiel geheel neer te zetten.
Ik ben hiervoor overgestapt naar MSMQ i.c.m NServiceBus. Hiermee heb je de volgende voordelen:
- Het is mogelijk om subscriptions te persisten. Je hebt immers alleen het adres van de client nodig.
- Als de client even niet bereikbaar is worden events in de queue opgeslagen om te wachten tot dat de client er weer is.
- Als je nieuwe event messages wilt introduceren hoef je alleen maar een nieuwe message type te implementeren en te zorgen dat je clients iets gaan doen met dat bericht. Geen aanpassing is nodig in je service infrastructuur.
Dit dus, een bestaande (E)SB oplossing voldoet waarschijnlijk al.

Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Ik snap eerlijk gezegd ook niet waarom de p&p groep zo'n halfslachtige implementatie van pub/sub op het web hebben gegooid. Maarja er zijn wel meer dingen die p&p de wereld in gooit waarbij ik denk... nee dat is het toch niet helemaal .. :+