Page 1 of 2 1 2 LastLast
Results 1 to 15 of 21

Thread: Kbmmw Query service : multi-tenant maken

Hybrid View

  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 16: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
    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.

  5. #5
    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?

  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.

  10. #10
    Beste,

    Door een verschuiving van prioriteiten kan ik nu pas beginnen met de verbetering van onze service.
    @benno, Uw voorstel om dit in te bouwen als een ISAPI dll lijkt me heel wat.

    Kan ik ergens een voorbeeld downloaden of een tutorial vinden van hoe een isapidll werkt?
    (Dus los van kbmmw) Momenteel heb ik de pdf "Creating an ISAPI based application server" maar momenteel ontbreekt wat belangrijke informatie volgens mij.

    Ik werk met delphi 2007

  11. #11
    Misschien is dit iets voor je? Heb het zelf niet getest omdat ik geen ISAPI gebruik. Ik gebruik een Windows service.

    Even wat andere opmerkingen/tips.

    Een vuistregel/startpunt is dat je 1 kbmmw service instantie hebt per 10 gebruikers. Als voor het gebruik van de kbmmw service een database connectie nodig is, dan heb je dus net zoveel database connecties nodig als kbmmw service instanties. Waarschijnlijk is dit in jouw situatie het geval. Ik weet niet hoeveel gebruikers je hebt in totaal, maar het aantal database connecties kan redelijk snel oplopen en dus ook het aantal MB's werkgeheugen dat je nodig hebt voor deze connecties en de kbmmw service instanties.

    Of het met een ISAPI ook zo werkt weet ik niet maar in andere situatie is het zeker makkelijk om je server op een datamodule te bouwen, zoals Benno aangeeft, en niet rechtstreeks op bijvoorbeeld een Windows service. Dit is veel makkelijk voor debuggen en tijdens de ontwikkeling.

    Als je een ISAPI maakt is het volgens mijn niet mogelijk om meerdere transport types te gebruiken. Dit zou een probleem kunnen zijn/worden. Zelf gebruik ik een aparte transport voor kbmmw clients, REST clients en voor de WIB (Wide Information Bus, een message systeem)

    Realiseer je dat Delphi 2007 en de kbmmw versie die je gebruikt erg oud zijn en dat dit voor de nodige problemen kan zorgen en dat de support/hulp die geboden kan worden waarschijnlijk beperkt is.

    Ik weet niet of het mogelijk is, maar als je binnen kbmmw de URL kunt afvangen van de request zou je op basis daarvan de juiste database kunnen selecteren. Dan heb je maar één "Website" nodig in IIS.

    Kbmmw heeft recentelijk ook een httpSysServerTransport dit transport maakt gebruikt van hetzelfde communicatie mechanisme als IIS en is sneller dan Indy.

  12. #12
    Een vuistregel/startpunt is dat je 1 kbmmw service instantie hebt per 10 gebruikers.
    hmmm die kende ik nog niet. In mijn ervaring zie je wel zo'n factor in het aantal database connecties. Omdat je gebruik maakt van de connectionpool zie je dat het aantal connecties veel lager is dan het aantal gelijktijdige gebruikers van de service.

    Omdat je services verder stateless zijn en meestal kort lopende acties bevatten zal het aantal service instanties dat je nodig hebt ook wel meevallen. Je moet uiteraard wel even opletten op services die langlopende acties implementeren. Bij mij zijn dat vaak rapportage / statistiek services of services die bv van alles moeten doorboeken. Als je op die services veel gebruikers krijgt heb je ook meer instances nodig.

    Isapi is een microsoft oplossing, dus als je de techniek achter isapi wilt begrijpen kun je denk ik best even zoeken op msdn.

    Wat delphi versie betreft, ik heb zelf maar 1 keer isapi ingezet in productie en dat was in delphi 7. Delphi 2007 zou dus geen probleem moeten zijn.

  13. #13
    hmmm die kende ik nog niet
    Waarschijnlijk is het gebaseerd op de ervaring van Kim, maar je moet ergens beginnen. In praktijk zijn er natuurlijk ontzettend veel factoren die een rol spelen.

    Omdat je gebruik maakt van de connectionpool zie je dat het aantal connecties veel lager is dan het aantal gelijktijdige gebruikers van de service.
    Dat is denk ik niet helemaal juist volgens mij, tenminste niet bij query services. Als je 5 gelijktijdige gebruikers hebt die 5 instanties van een bepaalde query service gebruiken (waarvoor een database connectie nodig is), dan heb je ook 5 database connecties nodig om dit mogelijk te maken. Volgens mijn wordt er anders een queue gebruikt en moet je dus wachten op een beschikbare connectie. Waarschijnlijk merk je er in de praktijk weinig van bij korte durende acties.

  14. #14
    Dat is denk ik niet helemaal juist volgens mij, tenminste niet bij query services. Als je 5 gelijktijdige gebruikers hebt die 5 instanties van een bepaalde query service gebruiken (waarvoor een database connectie nodig is), dan heb je ook 5 database connecties nodig om dit mogelijk te maken.
    klopt. Alleen hebben de gebruikers permanent connectie met de kbmmwserver maar gebruiken ze maar soms een service. Je service weet niks van het verleden of van de gebruikers, behalve op het moment dat die iets voor die gebruiker aan het doen is. Daarom is het zo belangrijk om je services stateless te bouwen.

    Wat het aantal database connecties gaat iets vergelijkbaars op. Ook die connecties in de pool worden maar soms door een gebruiker ingezet. Die kunnen dus voor meerdere gebruikers ingezet worden. Je hebt bij kbmmw een off-line model, dus geen cursors e.d. in de database. Ook kan afhankelijk van je cache settings het nodige uit de cache gehaald worden.

    Je kunt dus best gevallen hebben met 20 of 30 gelijktijdige gebruikers, die maar 1 of 2 database connecties gebruiken en maar een paar service instances.

    Maar we dwalen af van de oorspronkelijke vraag, dus denk dat we deze discussie anders naar een nieuwe draad moeten verplaatsen.

  15. #15
    Dank u benno en luigi.
    Aan de hand van jullie advies ben ik er ingeslaagd om een multi db opzet te doen.

    Zal enige opvolg vragen in een nieuwe thread plaatsen indien nodig.

Page 1 of 2 1 2 LastLast

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
  •