Heim > häufiges Problem > Hauptteil

Prinzipien moderner Dateninfrastruktur

百草
Freigeben: 2024-09-18 14:27:34
Original
985 Leute haben es durchsucht

Die Entwicklung des Internets in den letzten Jahrzehnten hat zweifellos Auswirkungen auf die Funktionsweise unserer Gesellschaften. Von der Erleichterung der Globalisierung bis hin zur Bereitstellung neuer Technologien wie sozialer Medien und Verbraucher-Apps für fast jeden Menschen auf dem Planeten hat das Internet in die meisten Aspekte unseres täglichen Lebens Einzug gehalten. Diese Allgegenwärtigkeit geht jedoch mit einem ständig wachsenden Bedarf einher, enorme Datenmengen zu verwalten, was eine immer bessere Dateninfrastruktur erfordert.

Prinzipien moderner Dateninfrastruktur

Die Entwicklung des Internets ist vorbei Die letzten Jahrzehnte haben zweifellos die Funktionsweise unserer Gesellschaften beeinflusst. Von der Erleichterung der Globalisierung bis hin zur Bereitstellung neuer Technologien wie sozialer Medien und Verbraucher-Apps für fast jeden Menschen auf dem Planeten hat das Internet in die meisten Aspekte unseres täglichen Lebens Einzug gehalten. Diese Allgegenwärtigkeit geht jedoch mit einem ständig wachsenden Bedarf einher, enorme Datenmengen zu verwalten, was eine immer bessere Dateninfrastruktur erfordert.

Im Web 1.0-Zeitalter konnten wir eigentlich nur statische Inhalte im Internet lesen. Ein Jahrzehnt später wurde es mit Web 2.0 möglich, in sozialen Netzwerken online zu lesen und zu schreiben. Jetzt, mit Web 3.0 und dem Aufkommen von KI und Blockchain, generiert eine einzelne Person jede Sekunde etwa 1,7 MB Daten. Das summiert sich auf etwa 146,88 GB Daten pro Person und Tag. Solche anspruchsvollen Arbeitslasten bedeuten, dass die Dateninfrastruktur für die meisten Unternehmen heute geschäftskritisch ist. Eine moderne Dateninfrastruktur unterstützt alles von täglichen betrieblichen Workloads (OLTP) bis hin zu strategischen Entscheidungsworkloads (OLAP).

Angesichts der Datenanforderungen der Welt, in der wir heute leben, können wir zu dem Schluss kommen, dass der Zweck moderner Daten Die Aufgabe der Infrastruktur besteht darin, große Datenmengen effizient zu verarbeiten, ohne die Latenz, Konsistenz, Sicherheit oder Entwicklererfahrung zu beeinträchtigen. Wenn ein Ingenieur also über eine neue App oder Software nachdenkt (oder eine bestehende aktualisiert), muss er über den Entwurf einer modernen Dateninfrastruktur nachdenken, die ein hohes Datenwachstum bewältigen kann und gleichzeitig Effizienz, Sicherheit und Benutzerfreundlichkeit beibehält. In diesem Artikel besprechen wir die Prinzipien moderner Dateninfrastruktur auf einer höheren Ebene, damit Sie bei der Auswahl einer Technologie für Ihre Infrastruktur diese unter dem Gesichtspunkt bewerten können, wie gut sie die einzelnen Prinzipien erfüllt.

Skalierbares Design

Da eine wichtige Anforderung an Software heutzutage die Fähigkeit ist, mit riesigen (und wachsenden) Datenmengen umzugehen, sollte die Skalierbarkeit beim Entwurf einer modernen Dateninfrastruktur im Vordergrund stehen. Genauer gesagt ist es entscheidend, sowohl vertikal als auch horizontal skalieren zu können. Im Gegensatz zu älteren Datenplattformen, die oft auf monolithischen Architekturen basieren, die sich nicht an derart hohe Volumenanforderungen anpassen lassen, muss Software, die eine moderne Dateninfrastruktur nutzt, in der Lage sein, zunächst eine einzelne Serverinstanz (mit mehreren Kernen und Hunderten von GB Speicher) zu pushen. an ihre Grenzen bringen und dann mit einem verteilten Setup auf mehrere Instanzen erweitern. Es muss außerdem elastisch sein, um wachsende Datenmengen und plötzliche Verkehrsspitzen bewältigen zu können.

Warum?

Bei der vertikalen Skalierung bzw. Skalierung werden einem bestehenden System weitere Ressourcen hinzugefügt. Dies kann CPU-, RAM- und Speicherkapazitäts-Upgrades umfassen, die letztendlich günstiger sind, während die Arbeitslast geringer ist und gleichzeitig die Möglichkeit erhalten bleibt, in Zukunft stärker und schneller zu wachsen. Vertikal skalierbare Software kann die Hardware voll ausnutzen. Außerdem lässt es sich zunächst einfacher implementieren, da keine neue Systemarchitektur erforderlich ist, und es ist einfacher zu verwalten, da letztendlich weniger Knoten erforderlich sind. Es kann auch die Leistung von Apps verbessern, die CPU- oder speicherintensiv sind, und gleichzeitig Latenz- und Antwortzeiten durch In-Memory-Daten und schnellere Prozessoren reduzieren. Aber auf der anderen Seite hat auch optimale Hardware ihre Grenzen, und je teurer die Upgrades werden, desto weniger effizient wird es, nur horizontal zu skalieren. Durch die Skalierung wird auch die Fehlertoleranz nicht berücksichtigt, da ein Single Point of Failure entsteht.

Dann gibt es noch die horizontale Skalierung oder Skalierung, die es Systemen ermöglicht, deutlich stärker zu wachsen (theoretisch unendlich, obwohl in der Praxis andere Einschränkungen auftreten können) und die Möglichkeit zu haben, mehr gleichzeitige Benutzer und Anfragen zu verarbeiten, indem die Arbeitslast auf mehrere Maschinen verteilt wird . Die mehreren Knoten können durch vertikale Skalierung auch den Single Point of Failure besser angehen und den Lastausgleich verbessern. Eine elastische Skalierung ist auch mit Cloud-Plattformen möglich, bei denen Ressourcen je nach Bedarf hinzugefügt oder entfernt werden können. Die horizontale Skalierung kann bei höheren Volumina auch günstiger sein als die vertikale Skalierung. Andererseits ist da noch die schiere Komplexität so vieler Knoten zu berücksichtigen, zusammen mit dem Netzwerk-Overhead und der Schwierigkeit, die Datenkonsistenz aufrechtzuerhalten.

Der beste Weg, die Schwächen jedes einzelnen zu mildern und beide effizient zu nutzen, ist der Aufbau Software, die eine Kombination aus vertikaler und horizontaler Skalierung implementieren kann. Eine moderne Dateninfrastruktur sollte zunächst skalierbar sein, um die vorhandenen Ressourcen zu maximieren, und bei steigender Arbeitslast auf eine Skalierung umsteigen können. Wenn die Softwarearchitektur dies zulässt, lohnt es sich auch, einen hybriden Ansatz zu prüfen, bei dem die vertikale Skalierung einzelne Knoten optimiert und die horizontale Skalierung für Gesamtsystemwachstum und Redundanz sorgt.

Design To Fail Fast

Entwerfen Um eine moderne Dateninfrastruktur schnell ausfallen zu lassen, müssen Systeme geschaffen werden, die Ausfälle schnell erkennen und beheben und so die Zuverlässigkeit und Belastbarkeit verbessern können. Wenn ein System ausfällt, liegt das Problem meist darin, dass die Datenschicht nicht in der Lage ist, die Belastung zu bewältigen, und nicht die Anwendungs-Rechenschicht. Wenn bei der Skalierung eine oder mehrere Komponenten innerhalb der Dateninfrastruktur ausfallen, sollten diese schnell ausfallen und sich schnell erholen. Da die Datenschicht jedoch zustandsbehaftet ist, sollte der gesamte Fail-and-Recovery-Prozess auch die Dateninkonsistenz minimieren. Hochverfügbarkeit sollte für die heutige Dateninfrastruktur intuitiv und mühelos möglich sein.

Der Entwicklungspfad von der Sicherung über die Replikation bis hin zum automatischen Failover ist entscheidend für die Erzielung einer hohen Verfügbarkeit in Systemen. Jede Stufe verbessert den Schutz der Daten und die Wiederherstellung nach Failovers.

  • Der Übergang von regelmäßigen Sicherungen, die für eine langfristige Datenwiederherstellung erforderlich sind, zur kontinuierlichen Replikation verbessert die Datenverfügbarkeit und verkürzt die Wiederherstellungszeiten .

  • Durch die Implementierung eines automatischen Failovers zusätzlich zur Replikation wird sichergestellt, dass Anwendungen betriebsbereit sind. Failover-Systeme erkennen Ausfälle und wechseln automatisch zu Replikaten, um eine hohe Verfügbarkeit sicherzustellen.

  • Lastausgleich, verteilte Architekturen und Container-Orchestrierung können weiter zur Verbesserung der Verfügbarkeit beitragen.

Alte Dateninfrastrukturen weisen oft Single Points of Failure auf und verfügen nicht über Redundanzmechanismen, wodurch sie anfällig für Ausfallzeiten und Datenverlust sind. Heutzutage sind die oben besprochenen Funktionen unerlässlich und sollten für Entwickler leicht zugänglich sein.

Eine moderne Dateninfrastruktur muss über eine hohe Verfügbarkeit und Fehlertoleranz verfügen, und es sollte ein einfaches Umschalten möglich sein (entweder in der Benutzeroberfläche oder in der CLI). ) aus der Sicht des Benutzers. Offensichtlich ist eine Anwendung ohne verfügbare Daten sinnlos und Ausfallzeiten können zu Umsatz- und Reputationsverlusten führen. Daher sind automatisches Failover und hohe Verfügbarkeit ein Muss.

Schauen wir uns ein Beispiel an. Wenn eine E-Commerce-Website während des Black-Friday-Sales ausfällt, weil die Datenschicht keine hohe Verfügbarkeit bietet, führt dies direkt zu Umsatzeinbußen. Und diese Art von Umsatzverlust ist möglicherweise nicht erstattungsfähig. Um Ihrem Datenspeicher Hochverfügbarkeit zu verleihen, sollte eine moderne Dateninfrastruktur es Ihnen ermöglichen, diese einfach einzuschalten und Ihre Verfügbarkeitszone(n) auszuwählen. Mit ein paar Klicks in der Benutzeroberfläche oder nur minimaler zusätzlicher Konfiguration sollte Ihnen Hochverfügbarkeit zur Verfügung stehen.

Design for Speed

Heutzutage sind wir frustriert, wenn eine Google-Suche nicht funktioniert. Es kann nicht sofort geladen werden oder es dauert mehr als eine Millisekunde, bis die Benutzeroberfläche einer App für uns bereit ist. Standardmäßig müssen Datenbanken und Datenspeicher in der Lage sein, bei hohem Durchsatz schnell auf Benutzeranfragen zu reagieren. Benutzer erwarten von allen Anwendungen ein Echtzeit- oder nahezu Echtzeit-Erlebnis. Die meiste Zeit, selbst ein paar Millisekunden, ist zu langsam. Beispielsweise kann eine Web-API-Anfrage zu einer oder mehreren Abfragen an die primäre Datenbank auf der Festplatte und dann zu einigen bis sogar Dutzenden Vorgängen an den In-Memory-Datenspeicher führen. Für jeden In-Memory-Datenspeichervorgang ist eine Reaktionszeit von weniger als einer Millisekunde eine absolute Notwendigkeit für ein erwartetes Benutzererlebnis.

100 ms oder weniger ist eine ideale Wartezeit für einen Menschen, der Technologie erlebt, da sie sich augenblicklich anfühlt. Alles über 200 ms macht die Latenz offensichtlich und der Mensch fühlt sich frustriert. Wenn eine Anwendung also eine Latenz von mehr als 200 ms hat, neigen die Leute dazu, zu berichten, dass sie schwierig zu verwenden ist. Wenn die Bearbeitung einer Zahlungsanfrage beispielsweise länger als ein paar Sekunden dauert, kann es sein, dass sich der Kunde fragt, ob seine Zahlung erfolgreich war, und wenn er Zeit damit verbringen muss, das herauszufinden, verliert er möglicherweise einfach das Interesse am Kauf.

Design für Sicherheit

Da immer mehr Dinge online erledigt werden, sind wir verpflichtet, persönliche Informationen und Daten online weiterzugeben, um Aufgaben zu erledigen. Auch wenn wir selbst keine Daten weitergeben, sammeln Anwendungen Informationen über unser Online-Verhalten, die viel darüber aussagen können, wer wir sind. Allein durch die Nutzung von Software und Apps ist jeder anfällig für Datenschutzverletzungen, Cybersicherheitsbedrohungen und sogar Identitätsdiebstahl. Dies überlässt Ingenieuren die Verantwortung, die Sicherheit beim Entwurf ihrer modernen Dateninfrastrukturen sorgfältig zu berücksichtigen und gleichzeitig Compliance und Datenintegrität aufrechtzuerhalten.

Durch die Implementierung von RBAC, ACLs und gesicherten Netzwerkpraktiken können Ingenieure eine grundlegende Entwicklung entwickeln robustes Sicherheits-Framework, um alle Bedrohungen zu bewältigen und die Daten ihrer Software zu schützen.

RBAC oder rollenbasierte Zugriffskontrolle ist ein System zur Einschränkung des Zugriffs basierend auf Rollen, die Benutzern zugewiesen sind. Über die Definition von Rollen und Berechtigungen hinaus erfordert RBAC eine regelmäßige Überprüfung dieser Zuweisungen, um unbefugten Zugriff zu blockieren. RBAC bietet außerdem eine detaillierte Kontrolle über die Benutzerautorisierung und erleichtert die Verwaltung von Berechtigungen, wenn Personen der Organisation beitreten und/oder sie verlassen.

ACLs oder Zugriffskontrolllisten definieren, welchen Benutzern oder Systemen der Zugriff auf bestimmte Elemente gewährt oder verweigert wird Ressourcen. ACLs sind noch detaillierter als RBAC und bieten Flexibilität, da sie auf verschiedene Arten von Ressourcen wie Dateien, Verzeichnisse und Netzwerkgeräte angewendet werden können.

Gesicherte Netzwerkpraktiken schützen Daten während der Übertragung und stellen sicher, dass die Netzwerkkommunikation gewährleistet ist vor unbefugtem Zugriff und Angriffen geschützt. Um sichere Netzwerkpraktiken zu implementieren, sollten Verschlüsselungsprotokolle wie TLS und SSL verwendet werden, um Daten während der Übertragung zu sichern. Firewalls und Sicherheitsgruppen sollten den Datenverkehr auf der Grundlage der Sicherheitsregeln der Organisation kontrollieren. Ein Netzwerk sollte in verschiedene Zonen segmentiert werden, um die Ausbreitung von Sicherheitsverletzungen zu verhindern und Angriffe einzuschränken. Auch VPNs und sichere Zugriffslösungen tragen zum Schutz vor Fernzugriffen bei.

Es ist außerdem wichtig, die Datenaustauschmechanismen innerhalb der Organisation mit verschlüsselten Übertragungen und sicheren Dateifreigabeplattformen wie Google Drive oder Dropbox zu sichern, je nachdem Bedürfnisse des Unternehmens. Die Aufrechterhaltung einer klaren Dokumentation für Datenaustauschverfahren erleichtert auch die Aufrechterhaltung der Konsistenz.

Wartbarkeitsorientiertes Design

Veraltete Systeme verfügen oft über eng gekoppelte Komponenten und starre Architekturen, was die Konfiguration, Erweiterung, und integrieren Sie neue Teile, ohne Silos zu schaffen und die Komplexität der Wartung zu erhöhen. Die Dateninfrastruktur von Software ist ein Ökosystem aus beweglichen Teilen. Alle Teile müssen zusammenarbeiten, konfigurierbar und erweiterbar sein – und das alles, ohne dass Silos entstehen. In der Praxis ist dies aufgrund der Art und Weise, wie fehlbare Menschen jedes bewegliche Teil nutzen, nicht einfach. Hier sind jedoch ein paar Tipps, um die Aufgabe leichter zu bewältigen:

  •  b

Auch wenn alles beginnt, gut in ein einziges Ökosystem zu passen Eine modulare Datenarchitektur mit Microservices und Containerisierung erleichtert die Aktualisierung oder den Austausch einzelner Komponenten. Außerdem ist es sinnvoll, wo immer möglich Automatisierung für Aufgaben wie Bereitstellung, Skalierung und Überwachung einzusetzen. Dadurch werden menschliche Eingriffe und Fehler reduziert. Und natürlich sorgen Sie für eine qualitativ hochwertige Dokumentation und Standardisierung im gesamten Ökosystem.

Design für Kosteneffizienz

Wir haben die Kosteneffizienz nur kurz angesprochen, als wir über Skalierbarkeit gesprochen haben, aber gehen wir etwas näher darauf ein das Thema. Angesichts der zunehmenden Komplexität und des Umfangs von Datenvorgängen ist Kosteneffizienz von zentraler Bedeutung für kontinuierliche Innovation. Im Wettbewerbsumfeld der Softwarebranche sind Unternehmen, insbesondere Start-ups und mittelständische Unternehmen, häufig mit knappen Budgets und finanziellen Zwängen konfrontiert – jeder Dollar zählt. Daher muss unbedingt sichergestellt werden, dass jeder ausgegebene Dollar direkt zur Wertschöpfung und betrieblichen Effizienz beiträgt, ohne die Skalierbarkeit für zukünftiges Wachstum zu beeinträchtigen.

Ein Beispiel für ein Tool, das die betriebliche Effizienz fördert, ist DuckDB. Sicher, ein riesiger Cluster leistungsstarker Computer kann das Ergebnis unserer komplexen Analyseabfragen berechnen, aber Ingenieure sollten sich fragen: Brauchen sie wirklich so viel Leistung? Die überwiegende Mehrheit der Unternehmen benötigt lediglich eine Datenanalyse über einen Zeitraum von Hunderten von GB bis einigen TB an Daten. Als leichtgewichtige Engine kann DuckDB Ingenieuren das bieten, was sie brauchen, ohne unnötige Kosten für Funktionen und Leistung zu verursachen, die sie nie nutzen werden. Im Gegensatz dazu waren ältere Dateninfrastrukturen nicht auf Kosteneffizienz ausgelegt, da sie häufig auf teurer, proprietärer Hardware und Software beruhten, erhebliche Vorabinvestitionen erforderten und hohe laufende Wartungskosten verursachten. Darüber hinaus führte ihre Unfähigkeit zur effizienten Skalierung zu einer Überbereitstellung von Ressourcen zur Bewältigung von Spitzenlasten, was zu Kapazitätsverschwendung und höheren Betriebskosten führte.

Es ist auch wichtig zu prüfen, ob das Tool, das das Team einsetzt, Transparenz darüber bietet, wie Der Preis wird berechnet. Bei einigen Produkten richten sich die Gebühren nach der „Anzahl der Lese- und Schreibvorgänge“, der „Anzahl der abgerufenen Zeilen“ oder der „insgesamt verarbeiteten Daten“. Doch was bedeuten diese Zahlen wirklich? Die meisten Teams haben nicht einmal Zugriff auf solche Kennzahlen, geschweige denn, dass sie verstehen, wie das Produkt diese Zahlen ermittelt. Dies kann zu lächerlich hohen Kosten führen, die schwer zu verfolgen und zu beheben sind. Shopify zum Beispiel stolperte einmal über BigQuery, das keine veraltete Technologie ist, über eine 1-Millionen-Dollar-Abfrage.

Letztendlich sollten die Kosten in einer modernen Dateninfrastruktur vorhersehbar und effizient (sogar) sein im Maßstab). Alle Teammitglieder sollten in der Lage sein, die Preisgestaltung zu verstehen, was für Ingenieure bei der Entwicklung von Software ein wichtiger Aspekt sein sollte. Wenn jedoch die Benutzerbasis einer Software im Laufe der Jahre um das Zehnfache wächst, sollten die Kosten für die Dateninfrastruktur sicherlich nicht mithalten, wenn sie effizient gewachsen ist.

Design für Entwicklererfahrung

Eine moderne Dateninfrastruktur, die ist für eine positive Entwicklererfahrung optimiert, kann die Produktivität steigern, die Entwicklung beschleunigen und Fehler reduzieren. Worauf achten Entwickler also bei einer guten Erfahrung? Wir meinen Benutzerfreundlichkeit, vertraute Tools und Integrationen, die Freiheit, problemlos auf Daten zuzugreifen und sie zu verarbeiten, und keine Sorge um die Sicherheit. Umgekehrt möchten wir nicht mit einem unmodernen Datenspeicher arbeiten, der eine extrem komplexe Konfiguration aufweist, nicht sofort einsatzbereit ist und sehr spezielles Wissen erfordert, um überhaupt loslegen zu können.

Intuitiv und vertraut APIs und SDKs können Ingenieuren den Einstieg in die Entwicklung datengesteuerter Anwendungen erleichtern und sollten verfügbar und leicht zugänglich sein. CockroachDB ist beispielsweise mit dem Wire-Protokoll und der API von PostgreSQL kompatibel, was es Entwicklern erheblich erleichtert, bestehende Anwendungen zu migrieren. Diese Kompatibilität ermöglicht es CockroachDB, Teil des PostgreSQL-Ökosystems zu sein, sodass Entwickler ihr vorhandenes Wissen und ihre Tools nutzen können. Neben der Bereitstellung einer klaren und benutzerfreundlichen Dokumentation für die Dateninfrastruktur ist es auch eine gute Idee, sicherzustellen, dass eine Dokumentation für APIs, SDKs und alle anderen Tools vorhanden ist, um Entwicklern dabei zu helfen, Engpässe und Hürden zu vermeiden.

Um den Prozess der Nutzung der Dateninfrastruktur so einfach wie möglich zu gestalten, handelt es sich um umfangreiche Funktionen, die verschiedene Anwendungsfälle unterstützen und häufig benötigte Verknüpfungen einführen. Dies kann Volltextsuche, Geodatenabfragen, integrierte Konnektoren für verschiedene Datenquellen usw. umfassen.

Unterstützung für verschiedene Datentypen (Zeichenfolgen, Zahlen und Vektoren sowie Einbettung für KI) und mehrere Modelle (relational). , Schlüsselwert, Diagramm, Dokument) reduziert den Bedarf an zusätzlichen Tools und Integrationen, reduziert die Komplexität der Datenverarbeitung und erleichtert die Abfrage und Analyse von Daten in verschiedenen Formaten. Und ja, das stimmt, ein Vektor ist nur ein Datentyp und wird oder wird von allen wichtigen Datenplattformen unterstützt.

Und dann ist da noch die Sicherheit. Wir haben bereits über die Bedeutung und Komponenten der Sicherheit gesprochen, aber es ist auch wichtig zu beachten, dass Sicherheit aus der Sicht des Benutzers integriert sein sollte. Ein Entwicklungsteam ohne Sicherheitsexpertise sollte sich darüber keine Sorgen machen müssen, sobald der Datenendpunkt vorhanden ist ordnungsgemäß geschützt. Zusätzliche Funktionen wie die Verschlüsselung im Ruhezustand sollten ebenfalls leicht konfigurierbar und umschaltbar sein.

Alles in allem geht es bei der Entwicklung eines Tools für Entwickler darum, langwierige Prozesse schneller und einfacher zu machen, damit sich Ingenieure auf die Innovation konzentrieren können rund um das, was sie aufbauen.

Fazit

Beim Entwurf einer modernen Dateninfrastruktur sind Skalierbarkeit, hohe Verfügbarkeit, Geschwindigkeit, Sicherheit, Wartbarkeit, Effizienz und natürlich die wichtigsten Prinzipien zu beachten , Entwicklererfahrung.

Nehmen Sie sich die Zeit, die Dateninfrastruktur Ihres eigenen Produkts anhand dieser Grundsätze zu bewerten: Verfügen Sie über eine moderne Dateninfrastruktur? Denken Sie darüber nach, an diese Komponenten zu denken, wenn Sie in Zukunft Datentechnologie hinzufügen oder entfernen.

Das obige ist der detaillierte Inhalt vonPrinzipien moderner Dateninfrastruktur. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dzone.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!