Hier ist unser einfacher Anwendungsfall: user2 möchte das Dokument von user1 in unser eigenes Repository innerhalb unserer Anwendung kopieren. Sollte einfach sein, oder? Alles, was wir tun müssen, ist, einen zweiten identischen Blob im Blobstore mit dem zurückgegebenen Schlüssel zu erstellen, den wir mit user2 verknüpfen können. Wir müssen hier etwas vermissen. Es scheint, dass die Hauptfunktion des App-Engine-Blob-Speichers darin besteht, Blobs zu handhaben, die von einem Browser hochgeladen und heruntergeladen werden, und eine einfache Kopieroperation, die serverseitig initiiert wird, ist nicht so einfach.Wie erstellt man am besten eine Kopie einer Blobstore-Entität in der App-Engine in Java?
Die offensichtliche Lösung schien die experimentelle Datei api in Java zu verwenden, aber keine Liebe. Es funktioniert, bis Sie in einer Dateigröße von mehr als einem MB oder so aufstehen, dann scheitert es etwas unvorhersehbar. Das alles in die Server-Ebene zu lesen, erscheint auch albern, wenn wir nur eine Kopie in der Speicherschicht machen müssen. Darüber hinaus ist die Wahrscheinlichkeit, dass wir ein experimentelles Feature in unsere Produktionsumgebung bekommen, gering, obwohl es nicht null ist.
Einige Informationen über unsere Umgebung: Die App ist in Java geschrieben und wir verwenden den Blobstore, nicht den Cloud-Speicher und sind für den Moment verpflichtet. Wir sind ein kleines Abteilungs-Team und würden gerne argumentieren, dass die App-Engine eine großartige Plattform ist, aber diese hat uns über den Haufen geworfen. S3 macht das blendend einfach, fehlt uns hier etwas wirklich Dummes?
Da Blobs nicht geändert werden können, warum die Kopie überhaupt machen? Habe einfach einen weiteren Verweis auf den gleichen Blob für user2.Wenn Benutzer den Inhalt des Blobs löschen dürfen, überprüfen Sie den Referenzzähler, bevor Sie ihn wirklich aus dem Blobstore löschen. –
Wir dachten darüber nach, verwarfen aber ziemlich schnell, weil Benutzer löschen können. Angesichts der Eleganz eines einzelnen Blobs und des Schmerzes beim Kopieren ist dies einen anderen Blick wert. Was wäre der beste Weg, dies zu modellieren? Eine Querverweissentität, die verfolgt, ob ein Blob mehr als einen Verweis enthält - einen Eintrag in der Querverweiselemente erstellen, wenn ein Blob "kopiert" wird, und einen Zähler oder eine ID hinzufügen/subtrahieren, bis er "kopiert" oder "gelöscht" wird Es gibt nur eine Referenz. Wir hatten unsere Probleme mit Zählern und dem Datenspeicher, also ist das Löschen, wenn es nur die letzte Referenz ist, etwas gruselig. – coleMan
Nach einiger Debatte haben wir uns entschieden, mit einer Variante von Kalles Vorschlag zu gehen. Beantworten Sie unten, falls es anderen hilft. Auch im Nachhinein dachten wir, wir hätten eine Code-Implementierungsfrage, aber es stellte sich heraus, dass es sich um eine Architekturfrage handelte, die vielleicht besser für den Stack-Austausch von Programmierern geeignet war. – coleMan