Die Geschichte von Octopus



Wenn Sie im Internet nach Produkten suchen, möchten Sie häufig Ihre Suchanfrage verfeinern, damit die Suchergebnisse relevanter werden. Ob es sich um die Farbe eines T-Shirts, den Getriebetyp eines Autos, die Anzahl der USB-Anschlüsse eines Laptops oder den Küchenbereich einer gewünschten Wohnung handelt.

Fast von Anfang an verfügten wir über ein System von flachen Feldern, mit denen die Anfrage verfeinert werden konnte. Das heißt, beim Erstellen und Suchen von Waren standen einfache Auswahlfelder zur Verfügung, mit denen Sie Produkte mit zusätzlichen Parametern speichern und anschließend suchen konnten.

Um neue Gipfel zu entwickeln und zu erobern, benötigte Yulia ein neues System, mit dem Sie Feldbäume mit manueller Eingabe und Auswahl von Werten erstellen und sogar neue Felder erhalten können, abhängig von zuvor ausgewählten Optionen. Als Apotheose musste ein einfaches System erstellt werden, um all dies über das Admin-Panel zu verwalten.

Erster Teil: "Cthulhu, komm"


Wir haben begonnen, dieses Problem zu lösen. Bei der Analyse möglicher Optionen haben wir uns ständig damit auseinandergesetzt, dass sich die Konzepte von „Feld“, „Präsentation“ usw. mit der vorhandenen Funktionalität überschnitten, was den Gesprächspartner in die Irre führte. Unser Kollege, der eine radikale Methode zur Trennung von Getreide und Spreu vorgeschlagen hat, hat uns vor dieser Verwirrung bewahrt - nennen wir das alles „Octopus“.

Warum Krake? Weil alles wie ein Tintenfisch klingt. Octopus ist ein allgemeines Feldsystem, das beschreibt:

  • welche Plattform die Felder anzeigen soll;
  • Welche Art von Präsentation ist für das Schema verantwortlich (Produkterstellung, Filter, Kartenanzeige usw.)?

Der Oktopus hat Tentakel oder Tentakel (Husaren, schweigen Sie!) - das nennen wir Äste, die beschreiben, wie bestimmte Felder im Formular angezeigt werden sollen. Es kann sein:

  • Eingabefelder;
  • Auswahlfelder
  • Feldgruppierungen;
  • Textfelder.

So etwas wie HTML-Markup, bei dem Tags vorhanden sind und Tags Parameter und Werte haben, die der Benutzer eingibt oder aus einer vordefinierten Liste auswählt.

Diejenigen, die für und gegen den Namen Octopus waren, waren ungefähr gleich geteilt, aber nach einiger Zeit nach dem Start des Systems wurde klar, dass dank dieses Namens jeder sofort klar verstand, was diskutiert wurde.

Teil zwei: Struktur


Wir ließen zu, dass das Wasserwesen der Name unseres neuen Systems wurde, aber nicht alles wurde den von den Meeresfürsten zerrissenen gegeben, es gab einen Platz für klassischere Bezeichnungen. Ich werde alle Elemente auflisten:

  • Krake - ist verantwortlich für die Struktur als Ganzes.
  • Tentakel - beschreibt die Anzeige jedes einzelnen Zweigs. Das widget wird an den Client übergeben, der angibt, wie das Feld angezeigt werden soll.
  • Attribut - speichert den eingegebenen Wert.
  • Wörterbuch - enthält eine Liste möglicher Werte zur Auswahl aus einer Liste.
  • Tag - enthält einen Wert, der aus der Liste ausgewählt werden kann.
  • Parameter - Attribut oder Tentakel können mit verschiedenen Parametern zur Validierung und Reaktion des Kunden ergänzt werden.
  • Abhängigkeiten - Eine Struktur, die die Reaktion eines Feldes auf die Wahl eines anderen beschreibt.

Der Kunde, der Octopus erhalten hat, kann die Seite zum Erstellen oder Bearbeiten des Produkts oder zum Suchen gemäß der oben beschriebenen Struktur zeichnen. Nach dem Ausfüllen werden die Daten vom Backend gespeichert und an die Suche zur Indizierung gesendet. Auf diese Weise können Redakteure schnell neue Felder erstellen und diese sofort für die Suche verwenden.

Dritter Teil: Präsentation


Hier geht es nicht um die Aufführung im Zirkus, wo die Oktopusse in Tentakeln klatschen und das Publikum mit Feinheiten und Wasserprozeduren erfreuen (Interessanterweise gibt es einen solchen Zirkus?). Ich werde darüber sprechen, wie unsere Kraken im Leben eines Kunden erscheinen.

Wie oben erwähnt, verfügt jedes Feldschema (Octopus) über eine Reihe von Parametern, die angeben, zu welcher Aktion dieses Schema gehört und wem es angezeigt werden soll. Beispielsweise fragt eine Android-Anwendung das Backend nach einem Suchfilterschema für den Bereich "Damengarderobe". Wenn die Datenbank ein Schema hat, das für die angegebenen Parameter geeignet ist, gibt das Backend es zurück und der Benutzer sieht die Felder "Farbe" und "Schuhgröße".

Wie ist das umgesetzt?

Die Bearbeiter im Admin-Bereich erstellen ein neues Octopus-Schema. Sie geben an, dass es für einen bestimmten Typ von Client-Anwendung (iOS, Android, Web oder für alle Typen) bestimmt ist, dass dieses Schema Felder für die Anzeige auf der Suchseite enthält, und vor allem das Schema einer bestimmten Warengruppe zugeordnet werden.

Wenn der Benutzer die Suche in der mobilen Anwendung eingibt, fordert der Client das Feldlayout vom Backend an, wobei er berücksichtigt, dass es sich um Android handelt, die Kategorie „Damengarderobe“ angegeben ist und das Schema für die Ansicht „Suche“ gelten sollte.

Vierter Teil: Suche


Der Benutzer in der Anwendung gab die Werte für seine Anzeige ein, der Kunde überprüfte sie gemäß den Regeln des Schemas und schickte sie an das Backend. Er überprüfte alles noch einmal und bewahrte es sicher auf. Jetzt wird die Anzeige Käufern mit einem vollständigen Feldsatz angezeigt. Dies reicht jedoch nicht aus, da die Anzeige vom Käufer gefunden werden muss.

Zu diesem Zweck senden wir alle Attribute, die mit der Anzeige geliefert werden, an unsere Suche. Dort werden die Daten indiziert, sodass Sie die Anzeige anhand der angegebenen Parameter sofort finden können. Die Redakteure können jederzeit neue Felder im Octopus-Verwaltungsbereich erstellen und die Nutzer können sie sofort beim Erstellen einer Anzeige oder beim Suchen verwenden.

Fünfter Teil: Integration


B2B-Partner arbeiten mit Yulia zusammen, um ihre Anzeigen-Datenbank mit uns zu teilen und ihre Reichweite zu vergrößern. Wenn wir beispielsweise mit einem Autopartner zusammenarbeiten, gibt es für jede Anzeige in einem externen Dienst eine große Anzahl von Feldern. Wie mache ich mit unseren Octopuses eine Datenbank mit Autoanzeigen? Die Antwort ist einfach - mit Mapping; oder, wenn der Partner verifiziert ist, können Sie Felder direkt in unserem System erstellen.

Über Kafka organisieren wir einen Kommunikationskanal mit einem Partner und erhalten:

  • Aktualisierung des Feldlayouts für Partnerprodukte;
  • Waren selbst und Manipulationen mit ihnen.

Bevor wir mit der Integration beginnen, werden wir herausfinden, welches Datenformat an uns gesendet wird und welche Arten von Feldern wir erhalten. Nachdem wir zuvor die Bedingungen für die Zuordnung in unseren Feldern im Code erstellt haben, erhalten wir Partnerschemata und ordnen sie zu. Sie können entweder neue Felder erstellen oder vorhandene zuordnen. Nach erfolgreicher Zuordnung können wir Waren erhalten und alle Felder werden in unserem Octopus angelegt. Wenn die Partner in Zukunft plötzlich das Programm ändern, ist unsere Teilnahme nicht mehr erforderlich.

Teil Sechs: Probleme


Mit all den Vorteilen der Octopuses stießen wir auch auf einige Schwierigkeiten. Wenn einzelne Entitäten in Redis zwischengespeichert wurden, wie sieht es dann mit dem gesamten Schema aus? Jedes Mal ist das Erzeugen sehr teuer, und das Speichern einer solchen größeren Schaltung im Cache ist problematisch. Außerdem müssen wir die Schemata ändern, wenn abhängige Felder ins Spiel kommen.

Wir haben beschlossen, die Ausgabe von Octopus-Programmen im Backend in zwei Phasen zu unterteilen:

  • Alle n Minuten wird im Hintergrund ein unveränderlicher Baum aktualisiert, den wir in den lokalen Cache stellen.
  • Verzweigungsmanipulationen: Ergänzen eines Baums mit Abhängigkeiten und Erstellen einer Antwort ohne Cache.

Dieser Ansatz löste das Cache-Problem und die Rückgabezeit der Felder wurde minimiert.

Teil Sieben: A / B-Test


Nirgendwo in der modernen Lebensmittelwelt ohne Prüfung der Produkteigenschaften. A / B-Tests haben Octopus nicht umgangen. Die Aufgabe bestand darin, die Belegung von Feldern in einer bestimmten Kategorie unter Berücksichtigung ihrer unterschiedlichen Anzahl und Variabilität von Werten zu messen. Aufgrund der Flexibilität der Schaltung war die Durchführung eines solchen Tests zeitsparend und die Funktionalität wurde schnellstmöglich in Betrieb genommen.

Wie haben wir das gemacht?

Auf der Ebene der Octopus-Verbindungen mit Produktkategorien haben wir einen Test für den Einstieg in das Experiment erstellt. Im positiven Fall wurde ein weiterer Octopus vergeben und der Benutzer sah einen anderen Satz von Feldern.

Wir haben auch A / B-Tests auf anderen Octopus-Ebenen eingeführt: in Tentakeln und Wörterbüchern.

Achter Teil: Wo sonst bewerben?


In Julia werden Octopuses nicht nur zum Ausfüllen und Suchen von Produktkarten verwendet. Mit Octopus-Schemata können Sie sie an beliebige Systemeinheiten anhängen. Derzeit werden Octopus-Schemata im persönlichen Konto des Benutzers und bei der Lieferung von Waren verwendet.

Neunter Teil: Ein Beispiel


Wörter sind Wörter, aber ohne ein Beispiel ist es ziemlich schwer zu verstehen. Erklären wir es an den Fingern. Nehmen Sie die Struktur der Felder zum Anlegen des Produkts in den Bereich "Immobilien".

Beispiel JSON aus der Kategorie Wohnung zu verkaufen - Wohnungsparameter
 { "title":" ", "widget":"group", "order":17, "params":{ "required":false }, "subfields":[ { "title":"", "widget":"section", "order":18, "params":{ "required":false }, "subfields":[ { "title":"  ", "widget":"select", "order":19, "slug":"komnat_v_kvartire", "type":"tag_id", "attribute_id":1374, "values":[ { "id":1, "value":"1 ", "order":1 }, { "id":2, "value":"2 ", "order":2 }, { "id":3, "value":" ", "order":3 }, { "id":4, "value":"", "order":4 } ], "params":{ "required":true } }, { "title":"", "widget":"input_int", "order":20, "slug":"realty_etaj", "type":"int", "attribute_id":1543, "params":{ "required":true, "min_value":1, "max_value":500 } } ] }, { "title":"", "widget":"section", "order":21, "params":{ "required":false }, "subfields":[ { "title":" ", "widget":"input_float", "order":22, "slug":"realty_obshaya_ploshad", "type":"float", "attribute_id":1541, "params":{ "required":true, "unit":"²", "min_value":1, "max_value":100000 } } ] }, { "title":"", "widget":"section", "order":25, "params":{ "required":false }, "subfields":[ { "title":" ", "widget":"input_float", "order":25, "slug":"building_flat_ceiling_height", "type":"float", "attribute_id":1518, "params":{ "required":false, "min_value":1, "max_value":10, "unit":"" } } ] } ] } 


Der Baum zeigt einen Ausschnitt des Felddiagramms zur Abgabe einer Anzeige in der Kategorie „Wohnung zum Verkauf“. Nach diesem Schema kann der Client die Benutzeroberfläche für den Benutzer zeichnen, die Felder in verschiedene Gruppen gruppieren, die eingegebenen Werte validieren und zum Speichern an das Backend senden. Lassen Sie uns näher darauf eingehen.

Tentakel können ineinander verschachtelt werden. Damit der Client versteht, was und wie angezeigt werden soll, haben wir die widget Eigenschaft eingeführt, die dem Client mitteilt, was an dieser Stelle angezeigt werden soll: Gruppierung von Feldern, Textblock, Einzug oder ein vollwertiges Feld.


Teil 10: Octopus-Abhängigkeiten


In einigen Fällen können nicht alle Werte, die in einem Auswahlfeld angezeigt werden, gleichzeitig in einem Formular angezeigt werden. Wenn wir zum Beispiel über Autos sprechen, wäre es für Benutzer äußerst unpraktisch, ein Formular mit allen Marken und Modellen auf einem Bildschirm zu platzieren, selbst wenn man die Verwendung von Such-Widgets und anderen Tricks berücksichtigt.

Um dieses Problem zu lösen, haben wir ein Abhängigkeitssystem implementiert, mit dem wir im Backend angeben können, welche Felder in Tentakeln angezeigt werden sollen, abhängig von den zuvor vom Benutzer in anderen Feldern ausgewählten Werten.

Beispiel: Ein Benutzer gibt einen Autoverkauf ein, wählt eine BMW Marke aus und im Feld Modell werden nur die Modelle angezeigt, die zu dieser Marke gehören.

Es ist so implementiert:

  • der Kunde erhält eine Feldkarte;
  • Für die Felder, die sich auf die Bildung des Schemas auswirken, wird ein spezielles Flag angegeben, mit dem der Client bei der Auswahl eines Werts das Schema erneut abfragt und diesen Wert an das Backend sendet.
  • der Benutzer wählt das Feld aus, der Client sendet eine Anfrage für das Backend;
  • Das Backend durchsucht das Abhängigkeitssystem nach verwandten Feldern für die angegebenen Werte und füllt sie in diesem Fall gemäß den zuvor erstellten Anweisungen.
  • Der Client erhält ein aktualisiertes Schema mit einem neuen Satz von Feldern.
  • Jetzt kann der Benutzer die Werte in den neuen Feldern auswählen.


Abschließend


Neben Witzen über Octopus haben wir ein leistungsstarkes Tool, mit dem Sie schnell verschiedene Feldschemata für Waren, Benutzerprofile, Lieferung usw. implementieren können. Administratoren können jetzt über das Control Panel Änderungen vornehmen und Schemata ergänzen, ohne die Entwicklung und Suche zu berühren. Durch das Hinzufügen eines A / B-Testsystems konnten Manager die Effektivität verschiedener Datensätze für Benutzereingaben auf einfache Weise überprüfen.

Source: https://habr.com/ru/post/de479924/


All Articles