Results 1 to 9 of 9

Thread: Kbmmw Query service : multi-tenant maken

  1. #1

    Kbmmw Query service : multi-tenant maken

    Beste,


    Ik wens een Kbmmw Query service om te bouwen(of een nieuw bouwen) die instaat is om per client een database te bedienen.

    Een beetje extra informatie:
    Ik heb sinds 2011 legacy code onder mij waarvan de oorspronkelijke programmeur is verdwenen/moeilijk te bereiken.

    We hebben een windows client die communiceert over tcp/ip met een kbmmwserver die op zijn beurt een connectie legt naar de database.
    Wij als bedrijf hebben meerdere klanten en iedere klant van ons krijgt dus een eigen(maar identieke) database. Met als gevolg ook een eigen Service.

    Op 1 server hebben we nu al boven de 200 databases en dus ook boven de 200 windows services. Dit brengt verscheidende problemen met zich. (kost,schaalbaarheid,onderhoudbaarheid).

    Wat ik nu wens te bereiken is die 200 windows services om te vormen naar 1 of enkele services(indien ik loadbalancing gebruik, maar is nog niet van toepassing in dit verhaal).

    Dit is de structuur van de service nu als volgt.
    Service(pas&dfm) inherites from TService
    • TkbmMwServer
    • TkbmMWTCPIPIndyServerTransport
    • TkbmMWADOXConnectionPool
    • TkbmMWPooledSession


    Unit2(pas&dfm) inherites from TkbmMWQueryService
    • TKbmMWBinaryStreamFormat
    • TkbmMWADOXResolver
    • TkbmMWADOXQuery


    Onze license van kbmmw is denk ik kbmMW Professional Edition 381.18

    Heeft er iemand een voorbeeld liggen van hoe ik dit best kan aanpakken om misschien enige tips?
    Voor mij is het totaal geen probleem om de huidige Service te dumpen en 1 te maken van de grond op.

    Alvast bedankt voor enige hulp.
    Last edited by jonas452; 12-Sep-18 at 15:58.

  2. #2
    Als het goed is zit er een multi db demo bij. Ik zou terug moeten zoeken van welke datum die versie is.

    De truc zit hem erin dat je meerdere connection pools moet aanmaken, een per klant database. Vanuit je client stuur je bv een id mee (na eerste inlog) en lokaal (of in je cluster) heb je logica om die user te mappen naar de juiste database. Op de service leg je vervolgens connectie met de juiste pool en de rest zou vanzelf moeten gaan.

    Hou bij je load balancing wel rekening met de serverside cache die in je connectionpool zit. Als je applicatie daar van afhankelijk is dan loont het om je balancing zo te maken dat je cache optimaal wordt gebruikt. Load balancing is volgens mij een enterprise feature. Check dat even voordat je een hoop tijd gaat investeren in een mogelijk verouderde kbmmw. De nieuwere kbmmw werken ook alleen nog met delphi xe2 en hoger.

    Heb jij per klant maar 1 queryservice?

    Ik ben momenteel zelf aan het sleutelen aan een multi tennant server opzet, die o.a. moet gaan werken met een unigui front-end. Mijn ei is daar nog niet volledig gelegd (wil in de toekomst bv ook nog apps kunnen laten werken met dezelfde server), maar gelukkig ben je met kbmmw erg flexibel en zijn er vele wegen naar rome.

  3. #3
    Dag Benno,

    Bedankt voor je reply. Heel veel code zit er eigenlijk niet in onze "service". Volgens mij heeft die persoon gewoon een tutorial gevolgd en was hij tevreden met een werkend resultaat.

    We hebben idd 1 queryservice(of windows service) per klant. 1 klant bestaat natuurlijk wel uit meerdere users.
    Helaas hangen wij wel vast aan delphi 2007. We zien het voorlopig nog niet zitten om alle onze componenten up te graden naar een hogere versie.
    We vermoeden dat dit een gigantisch werk zal zijn gezien onze grootte code basis (en heel wat spaghetti code)

    Thx voor de tip omtrent de multidb demo. Was niet van op de hoogte dat we in de source code ook die demo hadden.
    Zal eerst deze grondig bekijken voor ik verder vragen stel hier.

  4. #4
    Hoi Jonas,

    waarschijnlijk weet je het wel, maar een queryservice (in kbmMW context) is iets heel anders dan een windows service.

    In kbmMW bouw je een server (dat kan een applicatie, service of ISAPI module zijn). Die server bestaat uit een algemeen deel (kbmMWserver, connectionpool, TCPIP transport e.d.) en een of meerder services. Uit het lijstje wat je eerder postte heb jij inderdaad maar 1 kbmMW service (unit 2). KBMMWserver (die staat op je service.dfm) zorgt dat er kbmMW services worden gemaakt en gebruikt als een client bv data wil ophalen. De kbmMWservice (met je ADO componenten) maakt gebruik van de Connectionpool die op je service dfm staat. Die connectionpool zorgt vervolgens voor de verbinding naar de database. Vaak zullen er minder connecties naar de database zijn dan dat er concurrent gebruikers zijn. Dat komt omdat je in kbmMW gebruik maakt van een offline model en de connecties worden hergebruikt. Deels kan data ook uit de cache komen, dat is standaard gedrag wat je uit kunt schakelen.

    Voor jouw situatie moet je dus op je service dfm / pas wat gaan doen. Daar moet een mechanisme komen om meerder connectionpools aan te maken, 1 per klant (in jouw geval). Verder moet je iets maken om te herkennen welke klant een request doet (dat kun je waarschijnlijk uit de client-request halen. Op basis daarvan moet je uitzoeken welke connectionpool gebruikt moet worden, dat kun je op de service. De service moet vervolgens de ado queries knopen aan de zojuist opgezochte connectionpool en daarna het request uitvoeren.

    Op www.components4developers.com en dan menu Resources --> Docs is de nodige info te vinden. Ik weet uit mijn hoofd niet of de multi db optie daar beschreven is, maar het loont zeker daar even te kijken.

    Ik weet niet waar je bedrijf precies zit en of je in bent voor consultancy maar dat is eventueel mogelijk. Ik gebruik kbmMW al vanaf 2002. Ook Louis Caous (Luigi op het forum) is intussen een enthousiaste en in kbmMW ervaren gebruiker. Ook zou je je aan kunnen melden met een newsreader op news.components4developers.com. Daar zijn meerder newsgroepen waaronder die voor kbmMW en kbmMemtable. Daar kun je ook je vragen posten in het engels. Op de nieuwsgroepen zitten een aantal zeer ervaren gebruiker, die soms met verrassende oplossingen komen. Kim (de oorspronkelijke auteur) leest en reageert daar ook aktief (al leest ie intussen ook NLDelphi, lang leve google translate ). In ieder geval heel veel succes met je uitdaging.

    Als het geen geheim is, zou je dan willen delen wat voor soort applicatie het hier om gaat?

  5. #5
    Nu schiet me nog iets te binnen wat misschien ook een oplossing voor je kan zijn.

    kbmMW servers kunnen ook uitgerold worden als ISAPI DLL. Dan kun je ze hosten op een ISAPI geschikte server, zoals bv IIS. Ik begrijp dat jouw probleem vooral een management issue is met zoveel klanten, mogelijk ben je met die route sneller thuis.

  6. #6
    Zeer handige uitleg en omschrijving. Mijn kennis omtrent kbmmw is eerder matig. Ben er maar in gerolt sinds 2011 en gebruikt het dus gewoon zonder het zelf op te zetten.

    Ben eerder een C# developer. Maar dat houd mij niet tegen om deze uitdaging aan te gaan!
    Een consultant gebruiken is misschien wel een mogelijkheid voor ons bedrijf.(Er zijn meer problemen op te lossen dan enkele deze natuurlijk)

    Ik zal dit in ieder geval intern bespreken. De software is een administratieve toepassing voor de reissector met een eigen boekhoudings pakket en vele koppelingen met externe partijen.

    Als ik dit omvorm naar een ISAPI.dll dan vermoed ik dat ik dit ook zou kunnen hosten op onze azure omgeving. Klopt dat?(aangezien een webapp op azure eignelijk gewoon draait op iis in de achtergrond)
    Zoja dan ben ik daar zeker in geïnteresseerd. Enige tutorial daaromtrent?

  7. #7
    Jonas, ik heb daar uit de losse pols geen tutorial voor. Maar ik denk dat er op C4D wel wat staat. http://66.85.163.250/files/whitepape...ion_server.pdf

    Je moet wel even kijken hoe je server is opgezet. Je kunt geen form gebruiken als basis (volgens mij). Zelf zet ik componenten zoals Transport, connectionpools en kbmMW server en alle code die daarmee te maken heeft altijd op een datamodule. Op die manier kan ik tijdens ontwikkeling gewoon met een applicatie werken (die de datamodule aanmaakt) maar ook vrij simpel uitrollen als service of ISAPI door daar een apart project voor aan te maken.

    Ik heb zelf maar 1 keer een ISAPI server uitgerold met kbmMW dus zou er even in moeten duiken, Maar met de tutorial heb je mogelijk al genoeg om voor jezelf een klein eenvoudig testje op te zetten. Ik weet niet hoe dat hosten op Azure werkt, nog nooit iets mee gedaan (nadeel van ouder worden, nieuwe kunstjes leren gaat niet meer zo snel ). Maar ik kan me zomaar voorstellen dat zij inderdaad ISAPI dll's hosten op een IIS instance.

  8. #8
    Thx! Ik laat hier zeker het vervolg van mijn verhaal weten. Bedankt voor de hulp!

  9. #9
    http://66.85.163.250/files/whitepape...awarehouse.pdf bevat een manier om meerdere connection pools voor verschillende databases bij te houden. Pag 13. Het komt erop neer dat je de database naam als param meegeeft vanaf de client. Je kan dit met wat logica ook op de server regelen denk ik.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •