Online-Checks im Bundesnetz durch RabbitMQ, 1C und Black Magic


Im vergangenen Jahr hat uns der IT-Direktor einer der größten agroindustriellen Beteiligungen in Russland kontaktiert. Die Herangehensweise unseres Kunden an das Geschäft war beeindruckend. Er war einer der ersten, der die Idee eines Vollzyklusunternehmens umsetzte - vom Feld bis zum Regal im Lebensmittelgeschäft. Aufgrund der Verfügbarkeit und der hohen Qualität der Produkte hat sich diese Holding zu einer anerkannten Marke entwickelt, die sie kennen und auswählen. Zu dieser Zeit umfasste die Holding mehr als 650 Filialen und mehr als 20.000 Mitarbeiter, die in der gesamten Russischen Föderation verteilt waren.


Der Kunde musste sicherstellen, dass Schecks von allen Einzelhandelsgeschäften in Russland schnellstmöglich an das Zentrum geliefert werden, einschließlich Essensständen in abgelegenen Dörfern mit gelegentlichem Internet und minimaler Computerisierung.


Angesichts dieser Besonderheit wurde die Lösung des Problems zu einem aufregenden Abenteuer mit Tamburin, Schamanen und Kaninchenpfoten angesichts von RabbitMQ. Wie wir einen zusammengeschlossenen Cluster von Warteschlangen aufgebaut haben und was uns begegnet ist - unter dem Schnitt.


Über Kundenprobleme


Das Halten mit einer großen Anzahl verteilter Verkaufsstellen, die unter den Bedingungen eines harten Wettbewerbs operieren, verlangte von ihren Führungskräften, unverzüglich Managemententscheidungen zu treffen. Zu diesem Zweck benötigten die Manager Informationen zu Überprüfungen im Echtzeitmodus.


Im aktuellen System betrug die Lieferzeit des Schecks vom Kassierer zum zentralen System 3 Tage. Gleichzeitig wurden Informationen über den perfekten Kauf nicht regelmäßig erfasst (Scheckverlust).


Es war erforderlich, Informationen über den Verkauf „hier und jetzt“ bereitzustellen, um die Lieferung der Produkte an die Verkaufsstellen zu optimieren und schnell auf Änderungen im Gleichgewicht zwischen Waren und Nachfrage zu reagieren. Diese Informationen sollten gleichzeitig an den zentralen IS der auf 1C basierenden Holding und an den Computer des Merchandisers in einem bestimmten Geschäft / Outlet gesendet werden.


Darüber hinaus war es notwendig, eine zentralisierte und betriebliche Neubewertung der Waren über das Netzwerk sicherzustellen und einen Online-Datenstrom von allen Verkaufsstellen an das BI-System der Holding anzuschließen.
Als Ergebnis wurden Kriterien für den Erfolg des Projekts gebildet:


  • Schecks, die an der Kasse des Geschäfts ausgestellt wurden, sollten im zentralen 1C-System spätestens 1 Sekunde nach ihrer „Fiskalisierung“ an der Kasse in Gegenwart (Kommunikation) der Kommunikation sichtbar sein.
  • Stellen Sie bei vorübergehenden Kommunikationsfehlern sicher, dass die Schecks nach Wiederherstellung des Kommunikationskanals sofort garantiert an das zentrale System gesendet werden.

Für das Silver Bullet-Team war dies eine sehr verlockende Sache, da wir zu diesem Zeitpunkt bereits unseren 1C-Adapter für RabbitMQ entwickelt hatten und die Fähigkeit, ihn über große Entfernungen und Lasten in den Kampf zu ziehen, geekige Köpfe anzog. Das Konzept der „Position des Schecks in der Mitte in 1 Sekunde“ ist nicht so neu. Bereits 2013 haben wir die Idee der Verwendung von Warteschlangen in 1C vorgestellt und sogar in einem Handelsnetzwerk getestet. Zu dieser Zeit waren es jedoch sehr experimentelle Krücken, zu denen neben Rabbit auch gehörten + 1C ist immer noch C #, WCF und sogar ein bisschen C ++.


Natürlich haben wir es alle in intelligenten Büchern ausspioniert, die noch früher geschrieben wurden. Daher werde ich es nicht wagen, genau zu beurteilen, wann die Idee von Linien in Integrationsprojekten die Welt eroberte.


Auf die eine oder andere Weise haben der theoretische Teil und das Architekturkonzept ihre Wirksamkeit bewiesen, nur ein wenig blieb übrig - alles zu tun, zu testen, Fehler zu beheben, zu dokumentieren und bereitzustellen. : trollface:


Tauchen mit dem Kopf


Niemand weiß besser als der Geschäftsinhaber über seine Stärken und Schwächen Bescheid. Daher beginnen alle Integrationsprojekte mit einer Prüfung der Prozesse des Kunden und dem Verständnis des Ausgangspunkts (AS IS). In der Regel umfasst eine Unternehmensumfrage Folgendes:


  • Analyse von Informationen darüber, wie Geschäftsprozesse jetzt ablaufen;
  • Sammeln von Anforderungen an das System durch Befragung wichtiger Mitarbeiter, um zu verstehen, wie ihrer Meinung nach Geschäftsprozesse angeordnet werden sollten;
  • Formalisierung und Optimierung von Geschäftsprozessen.

Um Unstimmigkeiten zu beseitigen, verwenden wir die Formalisierung von AS IS- und TO BE-Geschäftsprozessen in Form von BPMN-Schemata. Es ist einfacher, es selbst zu verstehen, und es ist für den Kunden einfacher, nichts zu verpassen, wenn wir gemeinsam mit ihm das Prozessdiagramm durchgehen.


Aus den technischen Merkmalen ergab sich während des Audits, dass:


  • Outlets verwenden Windows-basierte Computer - mit heterogenen Betriebssystemen (abhängig vom Erstellungsjahr) von Windows XP bis Windows 7, 8, 10;
  • An den Registrierkassen wird die Frontol-Firmware mit Windows Embedded ausgeführt.
  • Die Einzelhandelsverwaltung verwendet heterogene Software, die sowohl Lösungen von 1C-Anbietern als auch eigene Entwicklungen umfasst.
  • Kommunikationskanäle werden nach dem Prinzip „Was ist das?“ im Bereich von Kabelleitungen bis zu USB-Whistle-Modems implementiert.
  • Einzelhandelsgeschäfte werden von lokalen Outsourcing-Unternehmen und nicht von einem zentralen Holding-Service bedient.
  • Die Funktionsweise des Systems hängt im Wesentlichen von der Wartungsfreundlichkeit (ordnungsgemäße Funktionsweise) des Computers des Warenverwalters an jeder Verkaufsstelle ab.

AS-IS-Integrationsschema


AS-IS-Integrationsschema


Die Prüfung ergab auch, dass die Geschäftsprozesse des Unternehmens praktisch nicht angepasst werden müssen, aber eine Verbesserung der Infrastruktur erforderlich ist, um einen unterbrechungsfreien Informationsfluss sicherzustellen.


Im Allgemeinen standen wir vor der Aufgabe, Dokumente zwischen den drei Komponenten des Prozesses zuverlässig zu liefern: Registrierkasse, Computer-Merchandiser und Zentrale. Gleichzeitig ist der Computer des Merchandisers eine Maschine „unter dem Tisch“. Sie kann auf Wunsch des Händlers ein- und ausgeschaltet werden. Oder sogar 23 von 24 Stunden ausgeschaltet sein. Beim Verlassen der Abenddämmerung muss der Händler jedoch einen tatsächlichen Satz von Preisen, Salden, Lagerartikeln usw. sehen.


Eine Lösung auswählen, einen Rechen einsammeln und Krücken platzieren


Die Integration von Warteschlangen ist seit langem ein gängiges Muster. Wenn Sie etwas mit vielen Links in einer unzuverlässigen Umgebung übertragen und gleichzeitig Datenströme weiterleiten müssen, benötigen Sie Ereignisse und Warteschlangen. Aus diesem Grund haben wir uns für RabbitMQ entschieden, da es sich problemlos in jede (uns erschienene) Umgebung integrieren lässt, einschließlich der 1C-Plattform, für die wir bereits einen eigenen Adapter für das AMQP-Protokoll hatten.


RMQ ist eine Art Datenflussmanager und ermöglicht die Integration in den "fast Echtzeit" -Modus, während eine schwache Systemkonnektivität beibehalten wird, Belastungen standgehalten werden usw. Ein guter Server, kurz gesagt, auf Habré wurde viel darüber geschrieben.


Eine der netten Funktionen ist das Out-of-Box-Clustering und die Möglichkeit, verteilte Servercluster zu erstellen, die zusammenarbeiten.


Bild


Ich mochte immer die Bilder mit der Architektur der Integration in die Warteschlangen. Sie bestehen immer aus drei Würfeln, in deren Mitte sich ein Nachrichtenbroker befindet. Lassen Sie ein solches Bild in diesem Artikel sein, um den Kanon nicht zu verletzen.


Bei der Erstellung des Schemas stellte sich die Frage, wo sich der Warteschlangenserver befinden sollte. Unter welchen Bedingungen kann unser System enden? Wir haben herausgefunden, dass es 5 Notsituationen gibt, in denen die Arbeit nicht aufhören sollte.


  1. Alle Blöcke sind enthalten.
  2. Das Zentrum ist nicht verbunden, es besteht Zugang zu einem Merchandiser.
  3. Der Merchandiser ist nicht verbunden, es besteht Zugang zum Center.
  4. Behinderte und Merchandiser und Zentrum.
  5. 1C-System deaktiviert.

Schecks in all diesen Situationen müssen durchbrechen, der Handel sollte nicht aufhören. Bei der Wiederherstellung des Kanals müssen Schecks beim Teilnehmer eintreffen. Ich möchte Sie daran erinnern, dass eine Verkaufsstelle auch ein ländlicher Stand sein kann. Es ist kein separater Server installiert, auf dem RMQ installiert werden könnte. Es stellte sich heraus, dass sich der Nachrichtenbroker direkt an der Kasse befinden sollte. Server sind ein unzulässiger Luxus, und Rabbit ist recht leicht und kann an einem kleinen POS-Terminal arbeiten. Warum also nicht ja?


Natürlich haben wir POS nicht zum einzigen Knoten des RMQ-Clusters gemacht, aber wir haben einen der Knoten des Verbundclusters direkt auf dem Handelsterminal platziert und Windows Embedded ausgeführt. Zu sagen, dass dies etwas einfacher war als zu tun, aber wir haben es fröhlich und rücksichtslos gemacht. Was ich dir jetzt sage.


So setzen Sie das RMQ-Terminal Frontol ein


Ich muss sagen, dass Erlang und der RMQ-Server selbst fast ohne Probleme zum Windows-Terminal gelangt sind. Im Client traten Probleme auf, die über die Registrierkassensoftware mit dem Server interagieren sollten.


Die Frontol-Registrierkassensoftware verfügt über eine recht gute Dokumentation, aus der hervorgeht, dass es möglich ist, das Verhalten mithilfe von Javascript anzupassen. "Yuhu!" - sagten wir und begannen, den JS-Client für RabbitMQ zu googeln. Es wurde schnell klar, dass ein Mist auf uns wartete. Auf der Vorderseite nicht ganz Javascript. Nun, d.h. Formal, ja, die Syntax ist dort dieselbe, aber der JavaScript-Computer selbst stammt von Windows Script Host, dem gleichen wie VBScript, cscript.exe und mehr. Kurz gesagt, es ist sehr alt, Microsoft-spezifisch und kein einziger vernünftiger Kaninchen-JS-Client wird daran arbeiten.


Im WSH-Ökosystem können Sie jedoch COM-Objekte verwenden, und wir gingen zum RMQ- Client für .NET .


Moderne Versionen dieses Clients unterstützen nicht mehr das .NET 3.5, das uns auf dem POS-Terminal zur Verfügung stand. Glücklicherweise sind die Quellen des Clients geöffnet, und außerdem wurden Tags auf dem Github des Projekts gespeichert, in dem .NET 3.5 noch unterstützt wurde. Ehre sei der Open Source! Es blieb, den Quellcode der alten Version des .NET-Clients zu entleeren, das Kontrollkästchen Com-Visible dort zu aktivieren und auf dem Terminal bereitzustellen.


Frontol Checkout-Interaktion


Registrierkassensoftware verfügt über eine API, die für die Interaktion verwendet werden kann.


function init() { frontol.addEventListener("openDocument", "beforeOpenDocument", true); frontol.addEventListener("closeDocument", "beforeCloseDocument", true); frontol.addEventListener("closeDocument", "afterCloseDocument", false); frontol.addEventListener("closeSession", "beforeCloseSession", true); frontol.addEventListener("closeSession", "afterCloseSession", false); addPolyfills(); //   ) initRmqVariables(); createRMQConnection(); } 

Die Funktionen des nativen JS an Bord von Windows sind äußerst schlecht. Beispielsweise gibt es kein Array.indexOf oder JSON.stringify. Aber die Welt ist nicht ohne gute Leute. Wir erinnerten uns an die beliebte browserbasierte Krücke „Polyphillas“ und bauten sie glücklich in die Kasse ein. Abgesehen von den Witzen wurden alle Zaubertricks mit JS absichtlich akribisch kommentiert, damit Generationen zukünftiger Administratoren klar und schnell verstehen können, was passiert, woher es kommt und wie es funktioniert.




Es wurde schnell klar, dass die JS-API einen Teil unserer Fälle nicht abdeckt. Da Frontol jedoch ein Firebird-DBMS enthält und es einen ODBC-Anbieter gibt, können wir Javascript verwenden, um die Datenbank des Kassierers mithilfe von Javascript direkt zu kontaktieren Holen Sie sich die Daten, die wir dort brauchen.


 function afterCloseSession() { var connection = getDatabaseConnection(); var qSelect = new ActiveXObject("ADODB.Command"); qSelect.ActiveConnection = connection; qSelect.CommandText = "SELECT ChequeNumber " + "FROM Document " + "WHERE " + " State = 1 " + " AND(ChequeType IN(0, 1, 2)) " 

Und schließlich sieht die direkte Arbeit mit dem Warteschlangenserver von unserem JS so aus:


 function createRMQConnection() { factory = new ActiveXObject("RabbitMQ.Client.ConnectionFactory"); factory.UserName = rmqUser; factory.Password = rmqPass; factory.VirtualHost = "/"; factory.HostName = "localhost"; try { rmqConnection = factory.CreateConnection(0); } catch (e) { throw new Error("     .   !\n" + e.message); } rmqChannel = rmqConnection.CreateModel(); rmqMessageProperties = rmqChannel.CreateBasicProperties(); rmqMessageProperties.ContentType = "text/plain"; rmqMessageProperties.ContentEncoding = "string"; rmqMessageProperties.DeliveryMode = 2; } 

Das Gesamtbild der Lösung


In der Architektur wurden folgende Prinzipien festgelegt:


  • Federation of RabbitMQ-Server - RMQ - Federation Server-Modus, damit Ereignisse an alle Empfänger übermittelt werden;
  • Überleben der lokalen Kasse - Wenn ein Ereignis an der Kasse eingetreten ist, muss es auf jeden Fall zugestellt werden, auch wenn die Kasse derzeit nicht über das Netzwerk erreichbar ist.
  • 2 Datenanbieter - Im normalen Modus werden die Daten über den Server (den Computer des Merchandisers) geliefert. Wenn der Computer des Merchandisers nicht verfügbar ist (infolge eines Unfalls oder aus anderen Gründen), liefert der Kassierer die Lieferung, wenn der Computer des Merchandisers eingeschaltet ist, erhält er seinen Teil der Ereignisse später als im Zentrum garantiert;
  • RMQ - Dienst RabbitMQ-Server mit offenen TCP-Ports für Clustering und Messaging;
  • Um die garantierte Zustellung von Nachrichten zu gewährleisten, wird Datenflussredundanz angewendet. Dies minimiert die Auswirkungen von Netzwerkverbindungen zwischen Systemknoten.
  • In 1C: Center wurde beschlossen, eine Reihe von RMQ-Servern im HA-Modus zu installieren - hohe Verfügbarkeit des zentralen Servers, inkl. Es gibt eine doppelte Reservierung und Ereignisreplikation, um die Lieferung zu garantieren.


In Übereinstimmung mit der Architekturlösung wurde das folgende Datenflussdiagramm erstellt:


  • Frontol, 1C - Start- und Endpunkte des Austauschs - Objekte, die Quellen und Empfänger von Nachrichten sind;
  • Verbundwarteschlange - Ein spezieller Warteschlangentyp, mit dem Sie ein verteiltes System zum Senden von Nachrichten erstellen können, in dem die Warteschlange im Knoten am Ausgang (Upstream) veröffentlicht und von der Warteschlange in der Mitte (Downstream) empfangen werden kann. Für die Übertragung von Nachrichten von Upstream zu Downstream ist auf dem zentralen Warteschlangenserver ein spezielles Plug-In (Federation PlugIn) installiert.
  • Schaufel - (wörtlich "Schaufel") - ein Mechanismus zum Übertragen von Nachrichten von einem Objekt (Warteschlange) zu einem anderen. Objekte können zu einem oder verschiedenen Servern gehören.
  • Die Systemarchitektur ermöglicht die Remote-Bereitstellungsverwaltung, dh die Möglichkeit, RabbitMQ-Server von einem einzigen Center aus auf jedem Computer im Holding-Netzwerk zu installieren.
  • Die Konfiguration und Verbindung zum Verbund erfolgt über die sogenannten Post-Install-Skripte, die standardmäßig mit der Bereitstellung von RMQ-Servern geliefert werden. Die erforderliche Konfiguration der Netzwerkparameter wird im Netzwerk des Kunden akzeptiert.

Die resultierende Schaltung liefert die geordneten Geschwindigkeitseigenschaften und arbeitet stabil, wenn eine der Komponenten herausfällt. Nachdem die Verbindung unterbrochen und wiederhergestellt wurde, gehen die gesammelten Daten innerhalb von 5-10 Sekunden in die Mitte. In der Praxis hat sich die Technologie lose gekoppelter Systeme bewährt. Alle Ereignisse finden wie in einem Büro statt, ohne die verschiedenen Arten von Verzögerungen im Zusammenhang mit der territorialen Verteilung und den unterschiedlichen Grad der Verfügbarkeit der damit verbundenen Kommunikationskanäle zu berücksichtigen.


Kurzer Abschluss


Ich möchte separat genießen, in was für einer erstaunlichen Zeit wir leben. In jüngerer Zeit war die Verwendung von Open Source in einem Produkt eine Art Askese. "Funktioniert Ihre Open Source-Software?" Wie gefällt dir dieser Kaktus? “ Dies ist heute eine absolute Maxime.


Ich kann mir kein Unternehmen vorstellen, das keine Open Source-Produkte im Produkt hat. Dank der Verfügbarkeit von Informationen und Open Source-Software ist die Umsetzung von Geschäftsideen viel einfacher und schneller geworden. Müssen Sie RMQ auf altes benutzerdefiniertes Javascript und Windows setzen? Einfacher geht es nicht. Eine gegoogelte Lösung ist etwas unangemessen? - sehen Sie, wie es gemacht wird und fügen Sie die fehlenden hinzu. Die Markteinführungszeit bei Verwendung offener Produkte wird erheblich verkürzt. Und jeder weiß, dass eine schnelle Freigabe einer Lösung einen Wettbewerbsvorteil bedeutet.


Github, Stackoverflow, offene Dokumentation und Standards ermöglichen den Start in wenigen Wochen, was zuvor langjähriges Know-how in verschiedenen Bereichen des Computerwissens erfordert hätte.


Und natürlich ist es besonders erfreulich, dass die 1C-Spitznamen-Community jedes Jahr ihre geschlossene Welt verlässt und sich in die globale IT einfügt. Zum Beispiel ist „1C: Enterprise“ heute eine der offiziellen Sprachen, die von Github unterstützt werden, und Leute aus der 1C-Community haben es dieser Sprache „beigebracht“. Diese Geschichte verdient wahrscheinlich einen separaten Artikel, vielleicht schreibe ich sie eines Tages. In der Zwischenzeit alles Gute und viel Glück!


Danke für deine Zeit!

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


All Articles