![]() |
Datenbank: Firebird • Version: 2.1.3 / 2.5 RC3 • Zugriff über: IBX
Firebird remote Zugriff über Internet
Hallo,
meine Anwendung soll direkt auf eine Datenbank im Internet zugreifen. Dies ist generell kein Problem, jedoch macht die Geschwindigkeit mir sehr zu schaffen. Was mir bereits aufgefallen ist: Ein Tunnel z.B via zeebeedee (mit höchster zlib Kompression) bringt zwar Vorteile bei großen Datenmengen, aber verzögert kleine Abfragen). Das Problem ist weniger die Bandbreite, als die Latenz zwischen Client und Server. Unter 20ms Latenz ist das ganze halbwegs nutzbar. Diese Latenzen sind aber nicht überall machbar. Es ist kein IBX spezifisches Problem (UIB/IBDAC brauchen ähnlich lange). Blob Felder sollten wo es geht als varchar mit definierter länge gecastet werden. Das Netzwerk Protokoll von Firebird 1.5 auf 2.1 auf 2.5 soll ja stark optimiert worden sein. Die Unterschiede fallen hier bei Tests jedoch sehr gering aus. Hier sehe ich das Hauptproblem. Ich komme leider nicht mit nur einem Query aus ;) -- Gibt es jemanden von euch, der Firebird über Internet oder VPN erfolgreich mit Latenzen >=50ms und vertretbarer Performance einsetzt. Auf was ist zu achten? Kann man die Antwortzeiten bei Abfragen, wenn notwendig auch über eine Middleware, verringern? Vielen Dank schonmal Raphael |
AW: Firebird remote Zugriff über Internet
Zitat:
Kann Zeebeedee Abfragen-Abhängig verschlüsseln / komprimieren? Ich habe mir für solche Zwecke über die Jahre ein inzwischen recht gut funktionierende Middleware mit Paket-Protokoll geschrieben, bei dem ich solche Sachen selbst in der Hand habe, sprich, auf meinem Server lauscht meine eigene Server-Applikation, die dort lokal an einer Firebird hängt. Clients konnektieren sich nicht direkt auf die Firebird, sondern auf meine Server-Applikation / Middleware. Mit dieser kann ich dann über OPCodes und Package-Types steuern, welche der Pakete verschlüsselt werden (bei sehr sensiblen Daten aymmetrisch mit RSA, mittelprächtige symmetrisch Blowfish und unsensible Daten gar nicht) und ebenso, ob das Paket komprimiert wird. Damit habe ich folgende Vorteile: 1) Ich bin nicht auf das Firebird-Netzwerk-Protokoll angewiesen, das ziemlich aufgeblasen ist 2) Ich kann den Overhead an Paketen minimal halten, je nach Situation, da ich statt Firebird meinen Server befrage, der die Daten dann lokal abfrägt und mir ggf. schon aufbereitet / gestrippt schickt. 3) Ich kann die Geschwindigkeit / Latenz viel besser tweaken, da ich selbst in der Hand habe, was genau übers Netz verschickt wird. 4) Ich kann die Datenbank später ggf. gegen eine andere (mySQL, PostGre etc.) austauschen, ohne dass dies die Clients irgendwie beeinflusst, da die Queries nur über die Middleware lokal auf dem Server ausgeführt werden und die Clients somit nie direkt SQL-Queries schicken, sondern meine Middleware-API verwenden. Firebird selbst empfiehlt ja auch eine Art von Middleware: Zitat:
Was mir noch enfällt ist, manche Abfragen vielleicht auf Stored Procedures auszulagern, falls es geht, das bringt auch manchmal etwas Geschwindigkeit. |
AW: Firebird remote Zugriff über Internet
Hi,
auch wenn meine/unsere Erfahrungen schon einige Zeit zurück liegt/en und zu Zeiten von FB 1.0x mit IBX als Zugriffskomponenten gesammelt wurden: Direkte Verbindungen zwischen Client und Server über das INet sind problematisch. Das von FB verwendete Protokoll ist ziemlich geschwätzig, ständig schnattern beide Seiten miteinander, und wenn es zu einer Verbindungsunterbrechung kommt, gibt es böse Fehlermeldungen und evtl. Datenverlust auf Clientseite, weil Änderungen nicht mehr gespeichert werden können usw. Wir haben daher für solche Anforderungen (langsame, evtl. instabile Leitungen zwischen Client und Server) umgestellt auf 3-Tier mit den RemObjects-DataAbstract-Komponenten und haben seitdem nur noch selten Probleme. Auch das Antwortverhalten selbst bei größeren Ergebnismengen ist respektabel. Kostet ne Menge, erfordert erheblichen Einarbeitungs-/Lernaufwand und ein etwas anderes Programmiererverhalten, lohnt sich aber meines Erachtens (auch aus anderen Gründen). Mag sein, dass es andere direkt zugreifende Komponenten gibt, die zumindest das Unterbrechungsproblem auffangen (ich glaube, FIBPlus hat da Funktionalitäten für?), aber dazu weiß ich nichts genaueres und habe keine Erfahrung. Das Geschnatter zwischen Client und Server bleibt bestehen. Wenn dann noch jedes Datenpaket "umverpackt" werden muss für das VPN, sehe ich da schon erhebliche Performanceprobleme. Viele Grüße Udo "Kretabiker" Treichel |
AW: Firebird remote Zugriff über Internet
Danke blackfin
Zebedee verschlüssselt und komprimiert Portabhängig und das sehr zügig. Die Ursache liegt definitiv nicht an Zebedee. Kleine Abfragen werden dadurch logischerweise minimal, aber kaum spürbar, verzögert. Einen solch großen Aufwand mit einem eigenen Protokoll wollte ich erstmal nicht betreiben. Stored Procedures müssen auch über eine Abfrage ausgeführt und ausgelesen werden (open), was wiederrum in dem selben Problem endet ;) |
AW: Firebird remote Zugriff über Internet
Über das Thema Multitier (mit MIDAS) bin ich auch gestolpert. Ich werde mir die RemObjects-DataAbstract-Komponenten mal genauer anschauen.
Was mich ein wenig stutzig macht sind die Verbesserungen am Netzwerkprotokoll, die bei mir kaum einen Effekt haben: Zitat:
Zitat:
![]() |
AW: Firebird remote Zugriff über Internet
Hallo,
Remote-Protokollverbesserungen setzen allerdings auch den Einsatz der neuesten Client-Library voraus. Hast du mit dem 2.5er Server auch die 2.5er Client-Bibliothek für den Connect verwendet? lg, Thomas |
AW: Firebird remote Zugriff über Internet
Ja, es wurde die Client Library aus dem aktuellen Snapshot verwendet und in GDS32.dll umbenannt.
Ich bin derweil ersteinmal so verbleiben, dass ich z.B mehrspaltige Rückgaben von Stored Procedures in einem Query zusammenfasse:
Delphi-Quellcode:
oder die SQL Abfragen breiter auslege, fetche und dann über locate suche um so ein oder mehrere "Opens" zu umgehen. Eher Dirty Hacks, als anständige Lösungen, aber aufsummiert machen die das ganze jetzt bei ~50ms Latenz benutzbar.
select SP1.*, SP2.* from SP1(<PARAM1>) join SP2(<PARAM2>) on 1 = 1
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz