Mehrinstanzenfähigkeit mit Namespaces implementieren

Mit der Namespaces API können Sie Ihre Anwendung mehrinstanzenfähig machen. Dazu wählen Sie einfach mit dem Paket in für jeden Mandanten einen Namespace-String aus.

Aktuellen Namespace festlegen

Sie können mit dem Namensbereiche abrufen, festlegen und validieren. Mit dem Namespace-Manager können Sie einen aktuellen Namespace für Namespace-fähige APIs festlegen. Wenn Sie im Voraus einen aktuellen Namespace in "," definieren, verwenden der Datenspeicher und Memcache diesen Namespace automatisch.

Die meisten App Engine-Entwickler verwenden ihre Google Workspace-Domain (ehemals G Suite) als aktuellen Namespace. Da Sie mit Google Workspace Ihre Anwendung in jeder beliebigen eigenen Domain bereitstellen können, können Sie mit diesem Mechanismus für verschiedene Domains jeweils unterschiedliche Namespaces konfigurieren. Dann können Sie diese verschiedenen Namespaces zum Aufteilen von Daten für alle Domains verwenden. Weitere Informationen finden Sie unter Benutzerdefinierte Domains zuordnen.

Im folgenden Codebeispiel wird gezeigt, wie Sie den aktuellen Namespace auf die oogle Workspace-Domain festlegen, die zum Zuordnen der URL verwendet wurde. Beachten Sie, dass dieser String bei allen URLs identisch ist, die über dieselbe Google Workspace-Domain zugeordnet wurden.

Wenn Sie für namespace keinen Wert festlegen, wird der Namespace als leere Zeichenfolge festgelegt. Der namespace-String kann beliebig sein, ist aber auf maximal 100 alphanumerische Zeichen, Punkte, Unterstriche und Bindestriche beschränkt. Konkret müssen Namespace-Strings dem regulären Ausdruck [0-9A-Za-z._-]{0,100} entsprechen.

Per Konvention sind alle Namespaces, die mit "_" (Unterstrich) beginnen, für die Systemverwendung reserviert. Diese System-Namespace-Regel ist nicht zwingend. Wenn Sie sie jedoch nicht beachten, könnte dies unbestimmte negative Auswirkungen haben.

Datenlecks verhindern

Zu den Risiken, die häufig mit mehrinstanzenfähigen Anwendungen assoziiert werden, gehört die Gefahr von Datenverlusten bei allen Namespaces. Nicht beabsichtigte Datenverluste können verschiedene Ursachen haben, einschließlich:

  • Die Verwendung von Namespaces mit App Engine-APIs, die noch keine Namespaces unterstützen. Zum Beispiel unterstützt Blobstore keine Namespaces. Wenn Sie Namespaces mit Blobstore verwenden, sollten Sie keine Blobstore-Abfragen für Endnutzeranfragen und keine Blobstore-Schlüssel aus nicht vertrauenswürdigen Quellen verwenden.
  • Verwendung eines externen Speichermediums anstelle von Memcache und des Datenspeichers über URL Fetch oder einen anderen Mechanismus, ohne ein Untergliederungsschema für Namespaces bereitzustellen.
  • Festlegen eines Namespace auf der Grundlage der E-Mail-Domain eines Nutzers. In den meisten Fällen sollen nicht alle E-Mail-Adressen einer Domain auf einen Namespace zugreifen können. Die Verwendung der E-Mail-Domain führt außerdem dazu, dass Ihre Anwendung einen Namespace nicht verwendet, bis der Nutzer angemeldet ist.

Namespaces bereitstellen

In den folgenden Abschnitten wird beschrieben, wie Namespaces mit anderen App Engine-Tools und APIs bereitgestellt werden.

Namespaces pro Nutzer erstellen

Bei einigen Anwendungen müssen Namespaces auf nutzerbezogener Basis erstellt werden. Wenn Sie Daten auf Nutzerebene für angemeldete Nutzer gliedern möchten, sollten Sie user.Current(c).ID verwenden, wobei eine eindeutige permanente ID für den Nutzer zurückgegeben wird. Im folgenden Codebeispiel wird gezeigt, wie die Nutzer-API für diesen Zweck verwendet wird:

Normalerweise stellen Anwendungen, die Namespaces nutzerbezogen erstellen, auch spezifische Zielseiten für verschiedene Nutzer bereit. In diesen Fällen muss die Anwendung ein URL-Schema bereitstellen, das festlegt, welche Landingpage einem Nutzer angezeigt wird.

Namespaces mit dem Datenspeicher verwenden

Standardmäßig verwendet der Datenspeicher für Datenspeicher-Requests den aktuellen Namespace. Die API wendet diesen aktuellen Namensbereich für datastore.Key-Objekte an, wenn diese erstellt werden. Sie sollten deshalb mit Bedacht vorgehen, wenn eine Anwendung Key-Objekte in serialisierter Form speichert, da der Namespace in diesen Serialisierungen beibehalten wird.

Wenn Sie deserialisierte Key-Objekte verwenden, achten Sie darauf, dass sie sich wie beabsichtigt verhalten. Die meisten einfachen Anwendungen, die den Datenspeicher (put/query/get) ohne andere Speichermechanismen verwenden, funktionieren erwartungsgemäß, wenn der aktuelle Namespace vor dem Aufrufen einer Datastore API festgelegt wird.

Query- und Key-Objekte verhalten sich in Bezug auf Namespaces grundsätzlich folgendermaßen:

  • Query- und Key-Objekte übernehmen bei ihrer Erstellung den aktuellen Namespace, es sei denn, Sie legen explizit einen anderen fest.
  • Wenn eine Anwendung einen neuen Key von einem Ancestor erstellt, übernimmt der neue Key den Namespace des Ancestors.

Namespaces mit Memcache verwenden

Standardmäßig verwendet Memcache für Memcache-Anfragen den aktuellen Namespace des Namespace-Managers. In den meisten Fällen ist es nicht notwendig, im Memcache explizit einen Namespace festzulegen. Dies kann außerdem zu unerwarteten Fehlern führen.

Es gibt jedoch einige eindeutige Instanzen, bei denen sich die explizite Festlegung eines Namespace im Memcache empfiehlt. Zum Beispiel verfügt Ihre Anwendung möglicherweise über allgemeine Daten, die für alle Namespaces freigegeben sind, z. B. eine Tabelle mit Ländercodes.

Im folgenden Codeausschnitt wird gezeigt, wie der Namespace im Memcache explizit festgelegt wird:

Namespaces mit der Aufgabenwarteschlange verwenden

Push-Warteschlangen verwenden standardmäßig den aktuellen Namespace, der bei der Aufgabenerstellung im Namespace-Manager festgelegt war. In den meisten Fällen ist es nicht erforderlich, in der Aufgabenwarteschlange einen Namespace explizit festzulegen. Dies kann auch zu unerwarteten Fehlern führen.

Aufgabennamen werden für alle Namespaces freigegeben. Die Erstellung von zwei Aufgaben mit demselben Namen ist nicht möglich, auch wenn bei ihnen verschiedene Namespaces verwendet werden. Wenn Sie denselben Aufgabennamen für viele Namespaces verwenden möchten, können Sie jeden Namespace einfach dem Aufgabennamen anfügen.

Wenn eine neue Aufgabe die Methode der Aufgabenwarteschlange aufruft, kopiert die Aufgabenwarteschlange den aktuellen Namespace und gegebenenfalls die Google Workspace-Domain aus dem Namespace-Manager. Wenn die Aufgabe ausgeführt wird, werden der aktuelle Namespace und der Google Workspace-Namespace wiederhergestellt.

Es gibt einige eindeutige Instanzen, bei denen für Aufgaben, die für alle Namespaces funktionieren, ein Namespace explizit festgelegt werden sollte. Zum Beispiel könnten Sie eine Aufgabe erstellen, bei der für alle Namespaces Nutzungsstatistiken gesammelt werden. Sie könnten dann den Namespace der Aufgabe explizit festlegen. Im folgenden Codebeispiel wird gezeigt, wie mit der Aufgabenwarteschlange Namespaces explizit festgelegt werden.

Namespaces mit dem Blobstore verwenden

Der Blobstore ist nicht in Namespaces aufgeteilt. Damit in Blobstore ein Namespace beibehalten wird, ist es notwendig, über ein Namespace-fähiges Speichermedium auf Blobstore zuzugreifen. Hierfür stehen derzeit nur der Memcache, der Datenspeicher und die Aufgabenwarteschlange zur Verfügung. Wenn zum Beispiel der Key eines Blobs in einer Datenspeicherentität gespeichert ist, können Sie mit einem Key des Datenspeichers, der den Namespace berücksichtigt, darauf zugreifen.

Wenn die Anwendung über Schlüssel, die in einem Namespace-fähigen Speicher gespeichert sind, auf Blobstore zugreift, muss Blobstore selbst nicht nach Namespace aufgeteilt werden. In Anwendungen müssen Blob-Verluste zwischen Namespaces verhindert werden. Dazu muss auf Folgendes beachtet werden:

  • Verwenden Sie für Endnutzer-Anforderungen nicht BlobInfo. Sie können BlobInfo-Abfragen für administrative Anfragen verwenden, z. B. zum Generieren von Berichten über alle Anwendungs-Blobs. Die Verwendung für Endnutzeranfragen kann jedoch zu Datenlecks führen, da die BlobInfo-Einträge nicht nach Namespace aufgeteilt sind.
  • Verwenden Sie keine Blobstore-Schlüssel aus nicht vertrauenswürdigen Quellen.

Namespaces für Datastore-Abfragen festlegen

In der Google Cloud Console können Sie den Namespace für Datastore-Abfragen festlegen.

Wenn Sie die Standardeinstellung nicht verwenden möchten, wählen Sie den gewünschten Namespace aus dem Drop-down aus.

Namespaces mit dem Bulk Loader verwenden

BulkLoader unterstützt ein --namespace=NAMESPACE-Flag, mit dem Sie den zu verwendenden Namespace festlegen können. Jeder Namespace wird separat bearbeitet und wenn Sie auf alle Namespaces zugreifen möchten, müssen diese durchlaufen werden.