Hallo, mein Name ist Pavel Savelyev, ich bin der Leiter der Abteilung für Geschäftsprozessautomatisierung bei Lamoda. Wir arbeiten mit sehr unterschiedlichen Aufgaben und versuchen, für jede die bequemsten Werkzeuge auszuwählen. Dementsprechend verwenden wir verschiedene Sprachen - in unseren Systemen finden Sie Java, Go und ein wenig Kotlin für Android. Gleichzeitig wird ein erheblicher Teil der Entwicklung in PHP durchgeführt, und es werden mehr als zwei Dutzend Services darauf geschrieben, die nicht nur die Arbeit mit Bestellungen, sondern auch die betrieblichen Prozesse eines breiten Zustellnetzes, Call Center in drei Ländern und unseres eigenen Fotostudios automatisieren und all dies in Form bereitstellen Dienstleistungen für unsere B2B-Partner. Diese Services werden von 5 Entwicklungsteams unserer Abteilung unterstützt und entwickelt.

Während sich die Dienste selbst und die sie umgebende Infrastruktur entwickeln, treten in diesen Systemen häufiger ähnliche Aufgaben auf, z. B. die Anmeldung beim gemeinsamen CLS (Centralized Logging System), das Testen der Dateispeicherung und das Sammeln von Metriken für Prometheus und andere. Wir versuchen, Möglichkeiten zur Lösung solcher Probleme zu standardisieren und gemeinsame Komponenten für verschiedene Systeme zu verwenden.
Wenn eines der Teams mit der Anpassung oder Integration eines neuen Dienstes / Tools konfrontiert ist, das allen gemeinsam sein kann, initiieren wir die Entwicklung der Bibliothek in diesem Team. Anschließend wird die fertige Komponente für die zukünftige Wiederverwendung vorbereitet und öffentlich zugänglich gemacht.
Da ein solcher Prozess regelmäßig bei uns stattfindet, haben wir einen Leitfaden erstellt, der es uns ermöglicht, ihn äußerst schmerzlos durchzuführen. Ich werde versuchen, auf einer der nächsten Konferenzen darüber zu berichten.
Mehr als zwei Dutzend unserer PHP-Bibliotheken wurden auf GitHub öffentlich zugänglich gemacht. Und wir planen, uns weiter zu verbreiten. Warum? Nun, wir haben viele Ressourcen investiert und (ich möchte glauben) es gut gemacht. Und wir hoffen schlau, dass andere Entwickler unsere Bibliotheken nutzen, ihnen bei der Fertigstellung und Weiterentwicklung helfen, anstatt Zeit damit zu verbringen, ihre Analoga von Grund auf neu zu schreiben. In diesem Artikel möchte ich kurz auf sieben Bibliotheken eingehen, die zur Lösung allgemeiner Aufgaben für den E-Commerce entwickelt wurden. Ich würde mich freuen, wenn sie sich für Sie als nützlich erweisen, und ich werde mich noch mehr freuen, sie zusammen zu sehen :)
1. Online-Fiskalisierung: Ein Kunde für ATOL Online
Wie andere russische Unternehmen sind wir verpflichtet, die Anforderungen von FZ-54, darunter die Online-Fiskalisierung, vollständig zu erfüllen. Alle auf
lamoda.ru vorausbezahlten
Bestellungen werden immer fiskalisiert: Sie generieren Online-Schecks, die an Kunden gesendet werden. Unser Fiskalisierungsdienst arbeitet per API mit dem
ATOL Online- System
, und die erste
Bibliothek auf unserer Liste ist ein vollwertiger Client für diesen Dienst. Zusätzlich zur Bibliothek selbst haben wir ein
Bundle veröffentlicht , mit dem Sie es problemlos mit allen Projekten verbinden können, die auf dem Symfony-Framework basieren. Die Bibliothek selbst kann in jedes andere PHP-Framework eingebettet werden: Laravel, Yii usw. - schreiben Sie einfach einen „Wrapper“ für die Bibliothek.
2. Prepaid-Zahlungen: Interaktion mit Payture
Um Prepaid-Zahlungen zu verarbeiten, interagieren wir aktiv mit dem Payture-Service. Dieser Dienst verfügt über mehrere Softwareschnittstellen. Wir verwenden die
Payture InPay-Option und haben dafür einen eigenen
API-Client geschrieben. Die Bibliothek ermöglicht die Bearbeitung mehrerer Terminals und unterstützt die Standard-PSR-3-Protokollierung. Es ist auch möglich, den vorkonfigurierten Guzzle-Client zu verwenden. Dies erleichtert das Organisieren von Tests mit dem
Guzzle Mock Handler .
Unser
Bibliothekspaket bietet eine semantische Konfiguration von Terminals und ermöglicht Ihnen die bequeme Konfiguration von Clienteinstellungen (bisher nur Zeitüberschreitungen) für verschiedene API-Vorgänge.
3. Produktkennzeichnung: GS1 Datamatrix Code Parser
Eines der wichtigsten Projekte des Jahres 2019 in unserem Unternehmen ist die Unterstützung der staatlichen Kennzeichnung von Waren. Im Rahmen dieses Projekts werden für alle Produkte bestimmter Kategorien spezielle eindeutige Codes angewendet - im GS1 Datamatrix-Format. Mit diesen Codes kann jeder Käufer die Echtheit der Waren, ihre Herkunft und Geschichte überprüfen. Damit Lamoda-interne Systeme mit diesen Barcodes arbeiten können, haben wir eine
Bibliothek zum korrekten Parsen von GS1-Codes entwickelt.
In naher Zukunft planen wir auch, die Quellcodes unserer entwickelten Kunden für die Interaktion mit dem Markierungs- und Rückverfolgbarkeitsinformationssystem (IP MP) bereitzustellen.
4. Microservice Management: Middleware für den Tactician Team Bus
Wir haben mehr als hundert Microservices, die viele separate Vorgänge ausführen: Sie überprüfen den Status von Zahlungen oder neuen Dateien in Speichern, senden Steuerbefehle an die Kassierer, laden Fotos von externen Diensten herunter und verarbeiten sie. Fast alle diese Operationen werden im Hintergrund ausgeführt, und das Befehlsbusmuster eignet sich hervorragend für deren Verwaltung. Um den Bus in PHP-Systemen zu implementieren, haben wir eine fertige Lösung gewählt - die offene
Tactician- Bibliothek.
Es trat jedoch ein Problem auf: Unsere Hintergrundteams interagieren häufig mit externen Diensten, bei denen die Anzahl der Vorgänge in n Sekunden begrenzt ist. Und Tactician kann die Anzahl der ausführbaren Befehle in einem bestimmten Zeitfenster nicht steuern. Aus diesem Grund haben wir eine zusätzliche Middleware -
Tactician Rate Limit Library - entwickelt. Mit seiner Hilfe können Sie eine neue Verarbeitungsschicht hinzufügen, die die Anzahl der auf dem Bus ausgeführten Befehle gemäß der ausgewählten Ratenbegrenzungsstrategie verfolgt. Strategien sind steckbar, Strategien aus der
Stiphle- Bibliothek sind sofort verfügbar.
Ebenfalls gemeinfrei ist unser
Symfony-Bundle zur Bibliothek.
5. Sammeln und Rendern von Metriken für Prometheus
Unsere Microservices generieren technische und geschäftliche Metriken, die dann über den Prometheus Operator aus dem gesamten k8s-Cluster erfasst werden. Um all dies zu verwalten, haben wir eine
Bibliothek geschrieben , die benutzerdefinierte Metriken gemäß dem Szenario „Collect-Save-Show“ verarbeitet. Gleichzeitig unterstützt die Bibliothek Betriebsmodi, in denen eines der Skriptelemente weggelassen werden kann, um die Effizienz zu steigern. Beispielsweise kann für schnell berechenbare Metriken ein vereinfachtes "Collect-Show" -Szenario ausgeführt werden. Und die Arbeit mit langsamen Geschäftsmetriken kann teilweise in den Hintergrund übersetzt werden, während sie in zwei Phasen unterteilt ist: "Sammeln-Speichern" + "Sammeln (aus dem Speicher) - Anzeigen".
Die Bibliothek verfügt über die erforderlichen Abstraktionsebenen sowohl zum Schreiben ihrer Metrikgeneratoren als auch zum Schreiben von Repositorys. Standardmäßig gibt es einen abstrakten Adapter für Doctrine, der für die Entität konfiguriert werden kann, um Daten in der Datenbank zu speichern.
Prometheus und Telegraf httpjson werden derzeit als metrische Renderformate unterstützt.
Die Bibliothek wird mit einem Symfony-Bundle geliefert, das eine semantische Konfiguration von Metrikquellen, Repositorys und Routing-Metriken bietet. Es enthält auch Hilfsbefehle zum Debuggen und Speichern von Metriken aus Quellen (z. B. zum Berechnen von Cron-Metriken).
6. Testen der Dateispeicherung: Arbeiten mit verschiedenen Dateisystemen
Um das Testen zu automatisieren, verwenden wir das
Codeception- Framework, mit dem wir Tests auf verschiedenen Ebenen schreiben können und das über eine ziemlich umfangreiche Bibliothek von Standardmodulen verfügt. Wir haben kürzlich in einem separaten
Artikel mehr über unsere Ansätze zur Testentwicklung geschrieben und auf einer
PHP Russia- Konferenz gesprochen. Codeception verfügt über vorgefertigte Module für die Interaktion mit FTP und dem lokalen Dateisystem. In unseren Tests müssen jedoch mehr Dateisysteme verwendet werden. Zumindest verwenden wir auch AWS S3 und Webdav. Außerdem möchte ich mit allen Dateisystemen über dieselbe API interagieren (dies sind alle Dateisysteme :)).
Glücklicherweise gibt es eine offene
FlySystem- Bibliothek, die eine einzige Softwareschnittstelle für die Arbeit mit verschiedenen Dateisystemen bietet. Wir mussten also nur die beiden Tools kombinieren - indem wir einen Wrapper über FlySystem als
Codeception-Flysystem-Modul geschrieben haben . Jetzt unterstützt es SFTP, S3 und Webdav. Es reicht aus, die Einstellungen einmal zu konfigurieren, um eine Verbindung zum gewünschten Dateisystem in der yml-Testkonfiguration herzustellen. Danach können Sie mit allen Dateisystemen mit denselben Methoden arbeiten: Schreiben Sie die Datei, kopieren Sie die Datei, bereinigen Sie das Verzeichnis usw. Das Modul ist bereits auf der Seite mit Ergänzungen und Empfehlungen von Codeception enthalten:
codeception.com/addons .
7. Arbeiten mit Umgebungsvariablen im Mandantenmodus
In der Abteilung für die Automatisierung von Geschäftsprozessen gibt es Systeme, die im Mandantenmodus arbeiten. Um ihre Arbeit sicherzustellen, muss es möglich sein, mit Umgebungsvariablen zu arbeiten, um zu bestimmen, welche Variable zum aktuellen Zeitpunkt verwendet werden soll.
Unsere
Bibliothek bietet verschiedene Strategien für die Arbeit mit Umgebungsvariablen im Mandantenmodus. Basierend auf den in der Initialisierungsphase übergebenen Parametern bestimmt die Bibliothek, auf welche Umgebungsvariable in der aktuellen Anforderung zugegriffen werden soll.
Fortsetzung folgt
Dies ist nur der erste Teil der Bibliotheken. Wir haben noch ein Dutzend drinnen - sie warten in der Schlange, wenn wir sie ein bisschen „kämmen“ und öffentlich zugänglich machen. Es motiviert mich zu verstehen, dass diese Bibliotheken für andere nützlich sein können. Ich freue mich über die Kommentare und Sterne auf dem Github und hoffe, weiterhin Bibliotheken mit anderen Entwicklern entwickeln zu können. In der Tat arbeiten viele russische E-Commerce-Projekte mit ATOL und Payture zusammen. Für Datamatrix gibt es neben dem im Artikel beschriebenen Code-Parser auch einige Clients, die wir bereits intern verwenden. Diese Bibliotheken sind die ersten in der Warteschlange auf GitHub.
Wir versuchen, die anderen Sprachen nicht zu vergessen - wir haben bereits die erste Bibliothek auf Go gepostet (wir haben
hier auf Habré mehr darüber geschrieben) und bereiten andere vor. Bleib dran!