Frage

Eine Web-Anwendung, die wir für einen Kunden bestimmt schrieben geht Produkt-ized und Dutzende von Unternehmen verkauft werden, und wir werden das Hosting tun.

kann ich einige Hinweise über die Vor- und Nachteile der eine separate Instanz verwende für jeden Kunden Ausrollen im Vergleich mit einer einzigen (oder sehr kleinen Anzahl von) Multi-Tenant-Instanzen gehen.

Zuerst wird, wie wir Rampe, ich will wurde für jeden neuen Kunden eine separate Instanz der Anwendung ausrollen (sie online ein zu einer Zeit kommen wird), weil es die einzige unmittelbare Option ist . Ich stelle mir das nicht sehr gut skaliert bis zu Wartung geht - Änderungen Ausrollen wird sehr langwierig und möglicherweise fehleranfällig, wenn es mehr als 4 oder 5 Instanzen gibt. Es sei denn, wir irgendwie automatisieren.

Auch die Single-Instance-Philosophie scheint, wie es zu einer Reihe von Gabeln führen könnte, wenn die Menschen Anpassungen benötigen. Und es wäre schön, das zu vermeiden.

Was sind Ihre Erfahrungen mit diesem gewesen?

Bonus Frage # 1: Was zwischen 10 SQL-Server mit 2m der Performance-Unterschied ist jeweils im Vergleich zu einem großen eins mit 20m aufzeichnet? Lassen Sie uns sagen, dass sie alle in einer Tabelle sind, und wir sind in erster Linie Einsätze und wählt auf einzelne Datensätze zu tun. Manchmal ist die wählt auf einem indizierten varchar (12) oder Datumsfeld.

Bonus-Frage # 2: ich mir vorstellen, dass Forking zu vermeiden, würden wir die Anpassungen konfigurierbar, oder bauen ein Plug-in-Architektur machen. das könnte die Kosten der Anpassungen jedoch erhöhen, und ich will nicht einer dieser Läden sein, die eine Woche dauert eine Textbox, um die Größe, und Ich will nicht zu über investieren in Infrastruktur. Irgendwelche Gedanken auf, dass?

Scale-Details

Jeder Kunde wird einen angemessenen Betrag von Daten -. Bis zu einigen Millionen Datensätze

Es wird eine sehr kleine Anzahl von gleichzeitigen Benutzern sein, nur wenige pro Kunden, plus eine Handvoll interner Wiederholungen auf unserer Seite.

Es ist unklar, ob jeder Kunde Anpassungen erfordern wird, aber ich würde einige von ihnen wahrscheinlich sagen will, und vielleicht werden einige dieser Änderungen Dinge sein, dass andere Kunden wollen nicht sehen.

War es hilfreich?

Lösung

Ich habe keinen guten Grund für einen Ihrer beiden Optionen. Ich denke, die wirkliche Antwort liegt irgendwo in der Mitte: mehrere Instanzen, von denen jeder mehrere Clients Hosting

.

Dies fügt eine weitere Ebene der Automatisierung Verarbeitung, aber es bedeutet, dass Sie das Hosting billig halten können (Sie werden nicht herausgehen müssen und eine Cray jederzeit schnell kaufen) und (hoffentlich) diese Art von Mentalität bedeutet, dass Sie Failover tun könnten Backups ziemlich leicht.

Aber wir wollen nicht vorgreifen ... Wir über eine Webapp reden, nicht wahr? Holen Sie sich Ihre Datenbank (en) und aspnet auf verschiedenen Maschinen. Cluster Ihre Datenbanken und Sie haben eine viel glücklichere Zeit haben, um mit verschiedenen Front-End-Szenarien zu spielen. Sie werden auch zuerst aus der Puste zu gehobener je nachdem, was Bereich läuft können.

Mit den Klängen der es, Sie werden mit einem gruppierten Datenbank über die Hälfte am Ende, wenn keine vollständiges Dutzend Datenbank Maschinen und nur ein paar Front-End-Box.

Wie für Anpassungen, Sie haben es genagelt. Sie entweder eine vollständig Datenbank gehosteten Set von editierbaren Vorlagen oder Sie müssen die Instanzen anpassen. Ich bin für die erste. Es ist eine Menge Arbeit (ohne viel zurück), aber es lohnt sich, wie Sie sollten nur die Kern-Code ändern müssen, wenn (Sie werden!) Sie tun Upgrades. Die Jagd durch hundert Kunden individuellen Instanzen um sicherzustellen, dass sie sicher einen Entwickler töten Upgrade! Vorlage ist die Antwort. Ganz am allerwenigsten, können Sie benutzerdefinierte CSS ohne viel Schmerz lassen (aber sie würden jemanden brauchen, der ihre Sachen kannten).

Edit: Ich habe ein paar Beiträge für die all-in-one-Methode gehen gesehen. Aufteilung der Instanzen über mehrere Maschinen dämmt man von ein paar Dinge:

  • Wenn Sie einen Fehler nicht gefangen in Tests einzuführen, nur wenige Kunden auf einmal bewirkt werden

  • Hardware ausfällt. einen Mega-Server Herbst Mit mehr als eine Menge Leute auf einmal ärgern. einen Failover-Mega-Server zu haben, ist massiv teuer. eine Ersatz-Failover-Box pro drei oder vier laufenden Server zu haben, ist viel billiger und weniger Menschen ärgert.

  • Die Leistung kann zwischen den Boxen auf einer Client-by-Client-Basis ausgeglichen werden, so dass Sie ein paar Lichtnutzung Kunden mit einem schweren Client setzen, oder einfach nur eine Kiste mit einem paar mittel Verwendung Kunden füllen, usw. .

  • Zum gleichen Idee, Auslastungsspitzen oder andere Verlangsamungen nur Effekt Kunden auf dem gleichen Feld. Natürlich ist dies nicht das Gleiche für die Datenbank bedeutet, Sie können jedoch, dass in einem Cluster von Cluster aufgeteilt, wenn Sie dort ankommen.

Andere Tipps

, wenn sie mit einer ähnlichen Herausforderung konfrontiert, hier ist es, was wir haben:

  1. Wir haben eine Code-Basis mit mehreren SQL-Server. wir tun mehr IIS Server mit Kopien der gleichen Code-Basis erhalten. wir sind frei Kunden um von SQL Server auf SQL Server verschieben Leistung zu maximieren.

  2. , wenn ein Kunde für den $ hat, werden wir sie auf ihrem eigenen Server installieren und einen separaten IIS-Server für sie halten. Dies bietet Platz für die größten Kunden für jeden Monat, der viel mehr Geld zu zahlen (10 mehr Geld fach). wir jedoch nicht, so dass ihnen eine separate Code-Basis geben. wenn sie einen Mod benötigen, wir machen es sichtbar auf einer Basis pro Client (siehe # 3)

  3. kundenspezifische Programmierung führt in der Regel in einer konfigurierbaren Option. auch die Menschen, die uns zahlen, um ihre eigenen Server die gleiche Version des Codes erhalten. manchmal ist es so einfach wie eine Klausel in dem Code, „wenn der Kunde =‚ourbigcustomer dann aktivieren Sie diese Option.‘ja sagt, ist, dass kludgy Hartcodierung, aber wenn der Kunde genug Geld hat, das ist in Ordnung mit mir.

  4. ich nicht ganz aus Ihrer Frage erhalten, ob Sie verschiedene Kundendaten in eine große Datenbank .. unsere Regel we nie zu tun, dass (nie) mischen wollte. es ist eine der klügstenen Entscheidungen, die wir je gemacht haben. es macht die Datenmanipulation viel weniger riskant und Wiederherstellungen von Daten zu erleichtern.

Der große Vorteil der einzelnen Instanzen wird als jeden Kunden die Nachfrage steigt werden horizontale Skalierung. Wenn Sie zum Beispiel auf einem einzigen Server laufen lassen und ein Kunde braucht, plötzlich mehr preformance Sie gestopft sind. Aber wenn sie alle Einzel dann, dass Kunden zu einem glänzenden neuen Server zu verschieben ist relativ einfach.

Der große Nachteil wird die Instanzen alle einzeln in der Verwaltung sein. (Unabhängig davon, ob sie sind alle auf dem gleichen Server ausgeführt wird oder nicht).

Unabhängig sollten Sie immer nur eine Instanz der Codebasis haben. Und Anpassung sollten alle durch Plugins und Konfiguration gesteuert werden. Front-End soll von Inhalten natürlich seperate sein. Obwohl die Kosten für eine Änderung zu machen höher sein kann, kann der Nutzen in Bezug auf Funktionen, die Sie Ihren anderen Kunden anbieten (die nur Anpassungen werden Sie gebeten habe zu tun) wird sich auszahlen ich bin sicher. Welches ist nichts zu sagen, wie viel einfacher es wird eine einzige Code-Basis zu verwalten sein, wie auf mehr gegenüber.

würde ich dringend raten mit der einzigen Instanz von Ihrem Unternehmen gehostet gehen. Dies hat folgende Vorteile:

  • Sie haben physischen Zugriff auf den gesamten Code und Datenbanken, um Änderungen vorzunehmen und Updates.
  • Sie steuern die Qualität der Hardware es läuft.
  • Wenn Sie einen Fehler im gemeinsamen Code zu beheben, Sie haben es ein für alle Mal festgelegt Kunden.
  • Sie können die Anwendung Refactoring Design zum besseren Unterstützung von Kunden spezifischen Code und vermeiden Forking.
  • Da die Zahl der Kunden wächst, Scale-up und Scale-out können Sie Ihre Server gerecht zu werden Leistung / Ansprechbarkeit Anforderungen.
  • Ihr Anwendungscode und Datenbanken kann nicht durch manipuliert werden "Inquistive" Kunden.

würde ich muss sagen, dass es fast noch wichtiger ist mit Ihre Anwendung im Gegensatz ausgeführt wird, wie viele separate Instanzen dort davon sind.

Sicher, mehrere separate Instanzen beibehalten ist nicht ideal aufgrund der Support- / Wartungsaufwand, aber wenn diese Anwendungen. sind alle auf Servern, die Sie steuern, das Leben ist viel einfacher, dann an verschiedene Kunden Netzwerke und Server remote / physischen Zugriff benötigen.

Joel Spolsky spricht auch über genau diese auf Stackoverflow Podcast 67 .

  

Eine Sache, Joel hat gelernt aus   Fogbugz Verkauf: Software entwickelt, um   in-house bei einem auf einem Server installiert werden   Kunden vor Ort, unter voller Kontrolle von   dass Kunden, ist so gut wie nie wert   der Aufwand

20 Millionen Datensätze relativ gesehen ist nicht eine große SQL Server-Datenbank. Eine einzige gut bereitgestellt SQL Server könnte diese Größe bequem handhaben. Wichtiger jedoch ist die Anzahl der gleichzeitigen Zugriffe auf die Datenbank. Aber Sie sagen, dass es nur wenige Nutzer pro Kunde einsteigt, so ist unwahrscheinlich, dass Sie zu treffen, bis das Niveau der Parallelität wächst.

Alle oben genannten sind gute Punkte, aber sie fehlen zwei wichtige Fragen. Welche Preisklasse wird der Dienst angeboten an und wie viele Kunden (Größenordnung) werden Sie letztlich unterstützen müssen (dh Marktgröße)? In 3 Jahren haben Sie maximal 10 Kunden, von denen jede Sie jede Sie pro Jahr 10.000 $ zu zahlen $ 500.000 pro Jahr oder 500 Kunden bezahlen? Für eine kleine Gruppe von hoch bezahlten Premium-Kunden sind die Vorteile der einzelnen Einsätze klar, während die niedrigeren Preise und größere Kundenbasis eine gemeinsame Lösung (a la Oli Kommentar) verlangen ist der beste Weg zu gehen. Oder gehen Sie mit einer Cloud-Plattform, obwohl ich nur den Hype gelesen und gebastelt, anstatt eingesetzt, dass in diesem Bereich.

Bonus Frage 1: Tabellenlayout, Indexierung, Anzahl der Lese- / schreibt, Effizienz und Komplexität der gespeicherten Prozeduren (Sie Procs oder zumindest vorbereitete Anweisungen verwenden, nicht wahr?) Alle eine verdammt viel wichtiger als die Anzahl der physische Datensätze in der Datenbank zu einem Punkt. Darüber hinaus, dass Sie sich wahrscheinlich entweder einzelne SQL Server-Instanzen für jeden Kunden zur Verfügung stellen finden benötigen oder für einen Pool von Kunden, wieder abhängig von einigen der aufgeworfenen Fragen die ich oben.

Bonus Frage 2: die Zeit in Ihr Design für Templating Putting und eine Plugin-Architektur ist in dieser Situation wesentlich und Sie müssen es eher später als früher tun. Sobald Sie in dem Schleifen sind Code der Anpassung für zahlende Kunden werden Sie wahrscheinlich haben nicht die Zeit, es richtig zu machen. Dieser Punkt kann nicht genug betont werden. Vorlagen und Admin-Tools, die Ihnen schnell und tief Zugriff auf datengetriebene Veränderungen in Ihrem Produkt geben Ihnen viel Zeit auf der Straße speichern. Wie Ihr Unternehmen / Gruppe erweitert Sie dann weniger technisches Personal hinzufügen, die „Produktexperten“ sein kann, die 90% der Anpassung und Wartung durchführen können, die Freisetzung Ihren Kerns Entwicklung fortzusetzen oder zu anderen Projekten zu bewegen. Schließlich vernachlässigen Sie nicht Ihre Datenebene in diesem Planungsprozess. einen Kerndatenebene von (fast) unveränderlich gespeichert Procs und Tabellen ist sehr wichtig, mit benutzerdefinierten Tabellen und gespeicherte Prozeduren klar abgegrenzte eine gute Namenskonvention.

Viel Glück, können Sie mehr Details bieten, wenn Sie konkretere Vorschläge möchten.

Basierend auf einige der Ratschläge hier erhalten hat, wir haben eine monolithische Multi-Tenant-Implementierung Version unserer Anwendung beenden.

Ich bin froh, dass wir getan haben. Bis es fertig war, hatten wir 3 oder 4 Gabeln der Code-Basis (vor allem benutzerdefinierte Skin und Dinge, die wir nicht über n-Level-Support für, aber auch einige tatsächlichen Merkmale), und es war nur noch verrückter zu bekommen.

Wir haben die Multi-Tenant-Version und erfolgreich gefaltet alles. Es gibt eine Menge endete als etwa und viel zu denken, um zu verfolgen, aber unsere Kunden nicht einmal wussten, dass sie auf ein neues System bewegt worden waren.

Ich werde sagen, dass die tatsächliche Kundenmigration ein bisschen einen Bären ist. Ich dachte zuerst, dass wir es mit der Hand zu tun, wäre in der Lage im Backend, aber ich landete mit ein paar ziemlich beteiligten Skripte schreiben die Arbeit zu erledigen. Es gab einfach zu viele Identitätsspalten, und es ist nicht wie können Sie nur vorübergehend Einschränkungen deaktivieren, wenn Sie in ein Live-Produktionssystem zu importieren sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top