-
Der letzte Artikel dieser Reihe richtet sich an normale Programmierer. Wenn Sie nicht interessiert sind, können Sie einfach die letzten Absätze dieses Artikels lesen.
Bevor wir mit dem Entwurf der Codestruktur beginnen, schauen wir uns an, was wir zuvor vorbereitet haben: Wir haben einen WEB-Server mit Lastausgleich, einen Master-Slave-DB-Server und möglicherweise Sharding, einen Cache und skalierbaren Speicher. Alle Aspekte der Codeorganisation stehen in engem Zusammenhang mit diesen Vorbereitungen. Ich werde sie einzeln, zwei Mal drei auflisten und zum besseren Vergleich jeweils mit dem klassischen Satz „oben erwähnt“ beginnen.
Beeilen Sie sich nicht, die klassischen Satzmuster zu lesen, meine Gedanken sprangen und ich werde einen Absatz einfügen. In der tatsächlichen Entwicklung gehen wir immer einen Kompromiss zwischen Leistung und Code-Eleganz ein. Für heutige Computer und Sprachinterpreter ist die Frage, wie viele Schichten von Objektaufrufen und wie viele Schichten von Objektaufrufen es gibt und ob Variablen als Map oder HashMap deklariert werden sollen, das letzte, was berücksichtigt werden muss. Berücksichtigen Sie immer den langsamsten Teil des Systems und lösen Sie ihn vom langsamsten Teil. Überprüfen Sie beispielsweise, ob das von Ihnen verwendete ORM viele Dinge tut, die Sie nicht benötigen, und ob es wiederholte Datenaufrufe gibt. Was wir tun, ist die Entwicklung von Webanwendungen, nicht die zugrunde liegende Framework-API. Leicht lesbarer und verständlicher Code ist ein sehr wichtiger Aspekt, um die Qualität sicherzustellen. Es gibt verschiedene Methoden ... Vergessen Sie dieses Thema Wird separat besprochen. Wenn Sie kommunizieren möchten, können Sie meinem Weibo folgen : http://t.sina.com.cn/liuzhiyi .
Wie bereits erwähnt, muss die Last des Webservers ausgeglichen und der Bildserver getrennt werden. Wenn der Code den Client-Status verwaltet, sollten Sie den Status beispielsweise nicht auf einer einzelnen Maschine speichern. Nun, gesunder Menschenverstand. Wenn möglich, ist es am besten, von Anfang an eine einheitliche Schnittstelle für die Einzelpunktauthentifizierung des Benutzers zu entwickeln, einschließlich der Bestimmung des domänenübergreifenden Status, der Bestimmung des Status auf statischen Seiten und der Definition von Sprung- und Rückgabeparametern beim Anmelden Stellen Sie eine gute Schnittstelle auf der untersten Ebene bereit und wenden Sie sie an. Die Ebene wird direkt verwendet (siehe GAE-Benutzerdienst). Bei der Gestaltung der Anmeldung sollten die Eigenschaften mobiler Geräte berücksichtigt werden. Computer können beispielsweise Floating-Layer-Fenster verwenden, NOKIAs eigener Browser oder UCWEB können diese Ausdrucksform jedoch nicht verarbeiten. Das Programm muss sowohl Ajax-Anfragen als auch direkt über die URL verarbeiten können . fragen. Der Bildserver ist getrennt und die Ressourcendateien werden am besten auf dem Bildserver platziert, dh der WEB-Server bedient nur dynamische Programme. Obwohl die Entwicklung und das Testen etwas kompliziert sind (da für den Zugriff ein absoluter URI erforderlich ist), wird es in Zukunft viel einfacher sein, das Front-End der Seite zu optimieren, und die IO-Optimierung Ihres WEB-Servers wird es auch tun viel einfacher sein. Wenn das Programm auf Ressourcendateien verweist, muss es eine einheitliche Verarbeitungsmethode geben, z. B. das Kombinieren von CSS/js in einer Datei oder das automatische Hinzufügen von QUERYSTRING nach dem generierten URI Wenn der Cache-Dienst verwendet wird, ist die Generierung von QUERYSTRING die einfachste Möglichkeit, den Server-Cache und den Client-Cache zu aktualisieren.
Wie bereits erwähnt, wird die Datenbank repliziert, kann mehrere Master und mehrere Slaves haben und möglicherweise fragmentiert sein. Bei der Verarbeitung von Daten in unserem Programm ist es am besten, diese zu abstrahieren und auf einer separaten Ebene abzulegen. Nehmen Sie als Beispiel das beliebte MVC-Modell, bei dem eine Datenschicht unter der M-Schicht platziert wird. Bei dieser Datenschicht handelt es sich nicht um die allgemein bekannte Datenschicht JDBC/PDO/ActiveRecord usw., sondern um Ihre eigene Zugriffsdatenschicht, die nur Methoden verfügbar macht Datenzugriffsdetails ausblenden. Haben Sie keine Angst vor hässlichem Schreiben innerhalb dieser Datenschicht, aber sie muss alle Datenspeicherfunktionen bereitstellen. Sehen Sie die Wörter, die sich mit der Datenbank befassen, nicht auf einer anderen Ebene. Der Grund dafür ist, dass Sie im Fall einer einzelnen relationalen Datenbank SELECT...JOIN... oder direkt INSERT...INTO... verwenden können, aber Sie können einige Tabellen in einer Schlüsselwertdatenbank speichern, oder Danach müssen alle ursprünglichen Anweisungen und Methoden geändert werden. Wenn sie zu verstreut sind, wird bei der Transplantation viel Aufwand betrieben, oder es wird ein sehr großes Modell erhalten. Versuchen Sie beim Design auf Datenebene, JOIN-Abfragen zu vermeiden. Wir können mehr Redundanz und Caching durchführen. Jeder Datentyp benötigt nur eine Abfrage und kombiniert sie dann in Ihrem Programm. Bei komplexeren Datenkombinationen, wenn die Echtzeitanforderungen nicht hoch sind, kann die asynchrone Verarbeitung verwendet werden, und Benutzer erhalten beim Zugriff nur die verarbeiteten Ergebnisse. Vermeiden Sie beim Umgang mit Primärschlüsseln die Verwendung automatisch inkrementierender IDs und verwenden Sie eindeutige Werte, die durch bestimmte Regeln generiert werden. Dieser Primärschlüssel ist die einfachste Sharding-Verteilungsstrategie. Auch wenn Sie eine Auto-Inkrement-ID verwenden, ist es am besten, einen Auto-Inkrement-ID-Generator zu verwenden. Andernfalls kommt es leicht zu Konflikten mit dem Primärschlüssel, wenn die Slave-Datenbank versehentlich geschrieben wird.
Wie bereits erwähnt, blockieren einige Caches den vorderen Teil unserer Datenbank. Behandeln Sie den Abfrage-Cache von MySQL nicht als Cache. Wenn die Anwendung etwas komplex ist, wird QUERY CACHE zu einer Belastung. Caching ist eng mit der Datenbank und dem Geschäft verknüpft. Da es eng mit dem Geschäft verbunden ist, gibt es keinen einheitlichen Ansatz. Aber wir müssen noch einige Regeln befolgen. Regel 1: Je näher am Frontend, desto größer die Cache-Granularität. Beispielsweise wird die gesamte Seite am Front-End des WEB zwischengespeichert, ein Teil der Seite wird auf der nächsten Ebene zwischengespeichert und ein einzelner Datensatz im Bereich wird auf der nächsten Ebene zwischengespeichert. Denn je näher wir am Backend sind, desto flexibler ist unsere Bedienbarkeit und der Frontend-Code, der sich am meisten ändert, ist einfacher zu schreiben. Da sich die Produktanforderungen in der Praxis sehr schnell ändern und der Iterationszyklus immer kürzer wird, ist es manchmal schwierig, den Controller und das Modell klar zu unterscheiden. Teilweises Caching ist auf Controller-Ebene unvermeidlich, aber in diesem Fall muss sichergestellt werden Wenn dies geschieht, darf der vom Controller betriebene Cache keine Auswirkungen auf andere Datenanforderer haben, d. h. es muss sichergestellt werden, dass diese zwischengespeicherten Daten nur von diesem Controller verwendet werden. Regel 2: Das Programm kann ohne Caching keine Fehler machen. Wenn Sie den durch die Cache-Ungültigmachung verursachten Lawineneffekt nicht berücksichtigen, muss Ihr Programm dasselbe sein wie ohne Cache. Sobald der Cache ausfällt, ist der Lüfter Weibo leer vermasselt. Wenn Caching unerlässlich ist, ist es besser, dem Benutzer eine Fehlermeldung zu geben, als eine irreführende Nachricht. Regel 3: Cache-Updates müssen atomar oder threadsicher sein. Insbesondere wenn passives Caching verwendet wird, ist es sehr wahrscheinlich, dass derselbe Cache aktualisiert wird, wenn zwei Benutzer darauf zugreifen. Normalerweise ist dies kein großes Problem und der Cache kann neu erstellt werden nach Ablauf kann dies eine der Ursachen für die Kettenreaktion sein. Regel 4: Caching hat auch Kosten. Nicht nur die Kosten für Technologie, sondern auch die Kosten für die Arbeitszeit. Wenn eine Funktion Caching verwendet und es nicht verwendet, ist der Unterschied im vorhersehbaren Zugriffsvolumen gering, aber die Verwendung von Caching erhöht die Komplexität, dann besteht keine Notwendigkeit. Wir können in der nächsten Iteration eine TODO-Markierung hinzufügen und die Caching-Verarbeitung hinzufügen.
Wie bereits erwähnt, ist die Dateispeicherung unabhängig, sodass alle Dateivorgänge Remote-Aufrufe sind. Sie können eine sehr einfache RESTful-Schnittstelle auf dem Dateiserver bereitstellen oder XMLRPC- oder JSON-Dienste bereitstellen. Alle vom WEB-Server generierten und verarbeiteten Dateien werden dem Dateiserver über die Schnittstelle zur Verarbeitung mitgeteilt Bereitstellung einer beliebigen Dateispeicherung. Aus diesem Grund erfolgt das Hochladen von Bildern und das Speichern von Artikeln auf vielen großen Websites in zwei Schritten.
Das oben Genannte wurde tatsächlich von unzähligen Leuten gesagt, ich habe es nur in meinen eigenen Worten wiederholt, basierend auf den vorherigen Artikeln. Die Essenz der eigentlichen Analyse ist sehr einfach – zusätzlich zu einer guten funktionalen Logikschichtung brauchen wir auch Design Separate Schnittstellen für externe Ressourcenaufrufe wie Datenbankspeicher, Caching, Warteschlangen und Dateidienste. Sie können sich vorstellen, dass Ihr Programm auf Amazon EC2 läuft und alle seine Webdienste nutzt. Ihre Warteschlange ist sein SQS Der einzige Unterschied besteht darin, dass es sich bei der Schnittstelle von Amazon um einen Remote-Anruf und bei Ihnen um einen internen Anruf handelt.
Die Anbindung des Support-Service bedeutet, dass beim Ersetzen von MySQL durch PostgreSQL keine Änderungen am Geschäftsverarbeitungsprogramm erforderlich sind und das Migrationsteam nicht einmal allzu viel mit dem Geschäftsentwicklungsteam kommunizieren muss, sondern dass das Geschäftsentwicklungsteam die Schnittstelle programmiert als die Programmierung der Datenbank; es bedeutet, dass die Leistung nicht durch den Fehler eines Geschäftsentwicklers beeinträchtigt wird.
Wenn Sie sich nicht für Programmkompetenz interessieren, schauen Sie einfach hier nach——
Nachdem das Produktdesign abgeschlossen und das Programmgerüst erstellt ist, kann es an dieser Stelle zu Konflikten kommen. Es gibt ständig Beschwerden von Produktdesignern, dass ihre Ideen nicht die gewünschten Ergebnisse erzielen, und Programmierer beschweren sich, dass Produktdesigns unrealistisch seien. Diese Art von Beschwerde ist meist auf die Tatsache zurückzuführen, dass das Produktpersonal die Technologie nicht versteht und das technische Personal die Produkte nicht versteht. Im weitesten Sinne umfassen Produkte Marktstrategien, Marketingmethoden und funktionales Design. Wenn über Produkte und Technologien diskutiert wird, liegt der Fokus oft auf der Funktion, aber der tatsächliche Fokus liegt auf den Kosten für die Realisierung dieser Funktion und den Vorteilen, die diese Funktion mit sich bringt Ob es umsetzbar ist und ob es berücksichtigt werden kann. Wenn möglich, lösen Sie den Streit. Wenn nicht, werfen Sie eine Münze und sehen Sie Glück. Es gibt viele Beispiele dafür, dass Indikatoren aufgrund der Verbesserung einer Funktion ausfallen oder es zu Kampfverzögerungen aufgrund von Projektverzögerungen kommt. Radikale Entscheidungsträger konzentrieren sich auf Vorteile, konservative Entscheidungsträger konzentrieren sich auf Verluste und kluge Entscheidungsträger werden überlegen, ob das Problem wirklich so ernst ist.
Niemand kann vorhersagen, was in der Zukunft passieren wird. Ansonsten hängt die Gründung eines Unternehmens zur Hälfte vom Glück ab. Aber es gibt immer Dinge, die genau gesagt werden können, und man muss sich darauf verlassen, dass Daten für sich selbst sprechen.
Nicht 100 %, aber 99,9 % der Websites haben Zugriffsstatistikcode installiert, selbst mein http://zhiyi.us ist keine Ausnahme, und im Xinwen-Netzwerk wird immer über wissenschaftliche Entscheidungsfindung und wissenschaftliche Entwicklung gesprochen. Mit Statistiken lässt sich vieles ermitteln. Sie können beispielsweise anhand der Quelle-Ziel-Conversion-Rate analysieren, welche Kanäle die niedrigsten Pro-Kopf-Akquisitionskosten aufweisen, die Gründe für die Absprungraten der Benutzer anhand des Zugriffs auf Quellinhalte erraten und anhand des Benutzerklicks bestimmen, ob die Linkposition angemessen ist Verhalten. Kombinieren Sie Daten auf unterschiedliche Weise, um interne Zusammenhänge zu finden, interne und externe Faktoren zu analysieren, entsprechende Strategien zu formulieren und vorschnelle Entscheidungen zu reduzieren. Sich auf Daten zu verlassen, um Operationen zu unterstützen, ist eine sehr professionelle Angelegenheit. Obwohl ich keine tiefgreifenden mathematischen Modelle und komplexen Formelberechnungen verstehe, habe ich nach und nach gelernt, dass B an A und C an A und B liegt. Es ist immer noch relativ einfach .
Autor des Artikels: Liu Zhiyi (bitte geben Sie beim Nachdruck den Quelllink und den Autor an)
Artikelquelle: http://zhiyi.us/