El a帽o pasado, el director de TI de una de las empresas agroindustriales m谩s grandes de Rusia nos contact贸. El enfoque del negocio implementado por nuestro cliente fue impresionante. Fue uno de los primeros en implementar la idea de una empresa de ciclo completo, desde el campo hasta el estante en la tienda de comestibles. Debido a la disponibilidad y la alta calidad de los productos, este holding se ha convertido en una marca reconocida que conocen y eligen. En ese momento, la explotaci贸n inclu铆a m谩s de 650 puntos de venta y m谩s de 20,000 empleados distribuidos en toda la Federaci贸n Rusa.
El cliente necesitaba garantizar la entrega m谩s r谩pida de cheques al centro desde todos los puntos de venta minoristas en Rusia, incluidos los puestos de comida en aldeas remotas con Internet ocasional y una informatizaci贸n m铆nima.
Dada esta especificidad, la soluci贸n al problema se convirti贸 en una aventura emocionante con una pandereta, chamanes y patas de conejo frente a RabbitMQ. C贸mo creamos un cl煤ster federado de colas y qu茅 encontramos - debajo del corte.
Sobre asuntos del cliente
Sosteniendo con una gran cantidad de puntos de venta distribuidos, operando en condiciones de competencia feroz, exigi贸 que sus l铆deres tomaran decisiones de gesti贸n con prontitud. Para esto, los gerentes necesitaban informaci贸n sobre los controles en modo de tiempo real.
En el sistema actual, el tiempo de entrega del cheque del cajero al sistema central alcanz贸 los 3 d铆as. Al mismo tiempo, la informaci贸n sobre la compra perfecta no se registraba peri贸dicamente (p茅rdida de cheque).
Se requer铆a proporcionar informaci贸n sobre las ventas "aqu铆 y ahora" para optimizar la entrega de productos a los puntos de venta y responder r谩pidamente a los cambios en el equilibrio de los bienes y la demanda. Esta informaci贸n debe ir simult谩neamente al IS central de la explotaci贸n basada en 1C y a la computadora del comerciante en una tienda / punto de venta particular.
Adem谩s, era necesario garantizar una revaluaci贸n centralizada y operativa de los productos a trav茅s de la red, as铆 como conectar al sistema de BI de la explotaci贸n un flujo de datos en l铆nea desde todos los puntos de venta.
Como resultado, se formaron criterios para el 茅xito del proyecto:
- los cheques perforados en la caja de la tienda deben estar visibles en el sistema central 1C no m谩s de 1 segundo desde el momento de su "fiscalizaci贸n" en la caja en presencia (comunicaci贸n) de comunicaci贸n;
- en caso de fallas temporales de comunicaci贸n, garantice la entrega r谩pida y garantizada de cheques al sistema central despu茅s de la restauraci贸n del canal de comunicaci贸n.
Para el equipo de Silver Bullet, esto fue algo muy tentador, ya que en ese momento ya hab铆amos desarrollado nuestro adaptador 1C para RabbitMQ y la capacidad de lanzarlo a la batalla a grandes distancias y las cargas atra铆an mentes geek. El concepto mismo de "posici贸n del cheque en el centro en 1 segundo" no es tan nuevo, en 2013 presentamos la idea de usar colas en 1C, e incluso lo probamos en una red comercial, pero en ese momento eran muletas muy experimentales, que inclu铆an, adem谩s de Rabbit + 1C sigue siendo C #, WCF e incluso un poco de C ++.
Por supuesto, todos lo espiamos en libros inteligentes que fueron escritos incluso antes. Por lo tanto, no me aventurar茅 a juzgar exactamente cu谩ndo la idea de l铆neas en proyectos de integraci贸n comenz贸 a dominar el mundo.
De una forma u otra, la parte te贸rica y el concepto arquitect贸nico han demostrado su efectividad, solo quedaba una peque帽a cosa: hacer todo, probar, corregir errores, documentar e implementar. : trollface:
Bucear con la cabeza
Nadie sabe mejor que el due帽o del negocio sobre sus fortalezas y debilidades, por lo que todos los proyectos de integraci贸n comienzan con una auditor铆a de los procesos del cliente y la comprensi贸n del punto de partida (TAL CUAL). Por lo general, una encuesta de negocios incluye:
- an谩lisis de informaci贸n sobre c贸mo se desarrollan los procesos comerciales ahora;
- reunir los requisitos para el sistema entrevistando a empleados clave para comprender c贸mo, en su opini贸n, deben organizarse los procesos comerciales;
- formalizaci贸n y optimizaci贸n de procesos de negocio.
Para eliminar las discrepancias, utilizamos la formalizaci贸n de los procesos comerciales AS IS y TO BE en forma de esquemas BPMN. Es m谩s f谩cil entenderlo nosotros mismos, y es m谩s f谩cil para el cliente no perderse nada cuando revisamos el diagrama del proceso junto con 茅l.
A partir de las caracter铆sticas t茅cnicas, durante la auditor铆a se encontr贸 que:
- los puntos de venta utilizan m谩quinas basadas en Windows, con sistemas operativos heterog茅neos instalados (seg煤n el a帽o de creaci贸n) desde Windows XP a Windows 7, 8, 10;
- las cajas registradoras ejecutan el firmware de Frontol con Windows Embedded integrado;
- el circuito de administraci贸n minorista utiliza software heterog茅neo, que incluye soluciones de proveedores de 1C y sus propios desarrollos;
- los canales de comunicaci贸n se implementan seg煤n el principio de "qu茅 es, es decir", en el rango de l铆neas de cable a m贸dems de silbato USB;
- los puntos de venta minoristas son atendidos por empresas de subcontrataci贸n locales y no por un servicio de tenencia centralizado;
- El funcionamiento del sistema depende sustancialmente de la capacidad de servicio (funcionamiento adecuado) de la computadora del administrador de productos en cada punto de venta.

Esquema de integraci贸n AS-IS
La auditor铆a tambi茅n mostr贸 que los procesos comerciales de la compa帽铆a pr谩cticamente no necesitan ser ajustados, pero se requiere un refinamiento de la infraestructura para garantizar un flujo de informaci贸n ininterrumpido.
En general, nos enfrentamos a la tarea de entrega confiable de documentos entre los tres componentes del proceso: caja registradora, exhibidor de computadoras y oficina central. Al mismo tiempo, la computadora del comerciante es una m谩quina "debajo de la mesa". Se puede activar / desactivar a petici贸n del comerciante. O incluso ser apagado 23 de 24 horas. Sin embargo, al salir del anochecer, el comerciante debe ver un conjunto real de precios, saldos, art铆culos en existencia, etc.
Elegir una soluci贸n, recoger un rastrillo y colocar muletas
La integraci贸n de colas se ha convertido durante mucho tiempo en un patr贸n com煤n. Cuando necesita transferir algo a alg煤n lugar, con muchos enlaces, en un entorno poco confiable y enrutar flujos de datos al mismo tiempo, necesita eventos y colas. Por lo tanto, elegimos RabbitMQ, porque se integra f谩cilmente en cualquier entorno (nos pareci贸), incluida la plataforma 1C, para la cual ya ten铆amos nuestro propio adaptador para el protocolo AMQP.
RMQ es un tipo de administrador de flujo de datos y permite la integraci贸n en el modo de tiempo "casi real", mientras mantiene una conexi贸n d茅bil de sistemas, soporta cargas, y as铆 sucesivamente ... Un buen servidor, en una palabra, se ha escrito mucho sobre eso en Habr茅.
Una de las caracter铆sticas interesantes es la agrupaci贸n inmediata y la capacidad de crear cl煤steres de servidores distribuidos que funcionen juntos.

Siempre me gustaron las im谩genes con la arquitectura de la integraci贸n en las colas. Siempre consisten en tres dados, en el centro de los cuales hay un intermediario de mensajes. Deje que tal imagen aparezca en este art铆culo, para no violar el canon.
Al construir el esquema, surgi贸 la pregunta: 驴d贸nde deber铆a ubicarse el servidor de cola? 驴En qu茅 condiciones puede terminar nuestro sistema? Descubrimos que hay 5 situaciones de emergencia en las que el trabajo no debe detenerse.
- Todos los bloques est谩n incluidos.
- El centro est谩 desconectado, hay acceso a un exhibidor.
- El exhibidor est谩 desconectado, hay acceso al centro.
- Discapacitados y merchandiser y centro.
- Sistema 1C deshabilitado.
Los controles en todas estas situaciones deben abrirse paso, el comercio no debe detenerse. Al restaurar el canal, los cheques deben llegar al suscriptor. Perm铆tame recordarle que un punto de venta tambi茅n puede ser un puesto rural. No hay un servidor separado instalado en el que se pueda instalar RMQ. Result贸 que el agente de mensajes deber铆a estar directamente en la caja. Los servidores son un lujo inadmisible, y Rabbit es bastante ligero y puede funcionar en un peque帽o terminal POS. Entonces, 驴por qu茅 no s铆?
Por supuesto, no convertimos a POS en el 煤nico nodo del cl煤ster RMQ, pero colocamos uno de los nodos del cl煤ster federado directamente en el terminal comercial, ejecutando Windows Embedded. Decir esto fue algo m谩s f谩cil que hacerlo, pero lo hicimos alegremente e imprudentemente. Lo que te dir茅 ahora.
C贸mo poner el terminal RMQ Frontol
Debo decir que Erlang y el servidor RMQ llegaron al terminal de Windows casi sin problemas. Surgieron problemas en el cliente, que deber铆a interactuar con el servidor desde el software de la caja registradora.
El software de la caja registradora de Frontol tiene una documentaci贸n bastante buena, de la cual descubrimos que es posible personalizar el comportamiento usando Javascript. "隆Yuhu!" - dijimos y comenzamos a buscar en Google el cliente JS para RabbitMQ. R谩pidamente se hizo evidente que nos esperaba un fastidio. En el frente, no del todo Javascript. Bueno, es decir formalmente, s铆, la sintaxis es la misma all铆, pero la m谩quina JavaScript en s铆 es de Windows Script Host, la misma que es VBScript, cscript.exe y m谩s. En resumen, es muy antiguo, espec铆fico de Microsoft, y ni un solo cliente JS de conejos sanos trabajar谩 en 茅l.
Sin embargo, en el ecosistema WSH, puede usar objetos COM, y nos dirigimos hacia el cliente RMQ para .NET .
Las versiones modernas de este cliente ya no son compatibles con .NET 3.5, que estaba disponible para nosotros en el terminal POS, pero afortunadamente, el c贸digo fuente del cliente est谩 abierto y, adem谩s, el github del proyecto retuvo etiquetas en las que .NET 3.5 todav铆a era compatible. Gloria al C贸digo Abierto! Quedaba por desinflar el c贸digo fuente de la versi贸n anterior del cliente .NET, marque la casilla de verificaci贸n Com-Visible all铆 e implemente en el terminal.
Interacci贸n de pago de Frontol
El software de caja registradora tiene una API que se puede usar para la interacci贸n.
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();
Las capacidades del JS nativo que est谩 a bordo de Windows son extremadamente pobres. Por ejemplo, no hay Array.indexOf o JSON.stringify. Pero el mundo no est谩 exento de buenas personas. Recordamos la popular muleta basada en navegador llamada "polyphillas" y felizmente los incorporamos al cajero. Dejando a un lado las bromas, todos los trucos de magia con JS fueron intencionalmente comentados meticulosamente para que generaciones de futuros administradores puedan entender clara y r谩pidamente lo que est谩 sucediendo, de d贸nde vino y c贸mo funciona.


R谩pidamente se hizo evidente que JS-API no cubre parte de nuestros casos, sin embargo, dado que Frontol incluye un DBMS Firebird y hay un proveedor ODBC, podemos usar Javascript para contactar directamente la base de datos del cajero usando Javascript obtener los datos que necesitamos all铆.
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)) "
Y finalmente, trabajar directamente con el servidor de colas desde nuestro JS se ve as铆:
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; }
La imagen general de la soluci贸n.
Los siguientes principios se han establecido en la arquitectura:
- Federaci贸n de servidores RabbitMQ - RMQ - Modo de servidor de federaci贸n para que los eventos se entreguen a todos los destinatarios;
- supervivencia de la caja local: si se produce un evento en el proceso de pago, debe entregarse en cualquier caso, incluso si en este momento no se puede acceder a la caja en la red;
- 2 proveedores de datos: en modo normal, los datos se entregan a trav茅s del servidor (la computadora del comerciante), si la computadora del comerciante no est谩 disponible (como resultado de un accidente o por otras razones), el cajero entrega la entrega, cuando la computadora del comerciante se enciende, recibir谩 su parte de los eventos m谩s tarde que el centro, pero garantizado
- RMQ: servicio de servidor RabbitMQ con puertos TCP abiertos para agrupaci贸n y mensajer铆a;
- Para garantizar la entrega garantizada de mensajes, se aplica la redundancia del flujo de datos. Esto minimiza el impacto de las conexiones de red entre nodos del sistema;
- en 1C: Centro, se decidi贸 instalar un conjunto de servidores RMQ en modo HA: alta disponibilidad del servidor central, incl. Hay una doble reserva y replicaci贸n de eventos, para garantizar la entrega.

De acuerdo con la soluci贸n arquitect贸nica, se cre贸 el siguiente diagrama de flujo de datos:
- Frontol, 1C - puntos de intercambio inicial y final - objetos que son fuentes y receptores de mensajes;
- cola federada: un tipo especial de cola que le permite crear un sistema distribuido para enviar mensajes, en el que la cola se puede publicar en el nodo ubicado en la salida (aguas arriba) y su recepci贸n desde la cola en el centro (aguas abajo). Para la transmisi贸n de mensajes ascendentes a descendentes, se instala un complemento especial (Federation PlugIn) en el servidor de cola central;
- Pala - (literalmente "pala") - un mecanismo para transmitir mensajes de un objeto (cola) a otro. Los objetos pueden pertenecer a un servidor o diferente;
- la arquitectura del sistema proporciona una gesti贸n de implementaci贸n remota, es decir, la capacidad de instalar servidores RabbitMQ en cualquier computadora en la red de retenci贸n desde un solo centro;
- la configuraci贸n y la conexi贸n a la federaci贸n se llevan a cabo mediante los llamados scripts posteriores a la instalaci贸n, que vienen de manera est谩ndar con la entrega de servidores RMQ, con la configuraci贸n necesaria de los par谩metros de red aceptados en la red del Cliente.
El circuito resultante proporciona las caracter铆sticas de velocidad ordenadas y funciona de manera estable cuando alguno de los componentes se cae. Despu茅s de que la conexi贸n se pierde y se restablece, los datos acumulados van al centro en 5 a 10 segundos. En la pr谩ctica, la tecnolog铆a de los sistemas acoplados libremente ha demostrado su eficacia. Todos los eventos ocurren como en una oficina, sin tener en cuenta los diversos tipos de retrasos asociados con la distribuci贸n territorial y el grado de disponibilidad de los canales de comunicaci贸n inherentes a ella.
Breve conclusi贸n
Me gustar铆a disfrutar por separado de lo incre铆ble que vivimos. M谩s recientemente, el uso de c贸digo abierto en un producto fue una especie de ascetismo. "驴Su software de c贸digo abierto funciona?" Entonces, 驴c贸mo te gusta este cactus? Hoy, esta es una m谩xima absoluta.
No puedo imaginar una empresa que no tenga productos de c贸digo abierto en el producto. Gracias a la disponibilidad de informaci贸n, software de c贸digo abierto, la implementaci贸n de ideas de negocios se ha vuelto mucho m谩s f谩cil y r谩pida. 驴Necesita poner RMQ en Javascript y Windows personalizados antiguos? No hay nada mas facil. 驴Una soluci贸n en Google es un poco inapropiada? - vea c贸mo se hace y agregue los que faltan. El tiempo de comercializaci贸n al usar productos abiertos se reduce significativamente. Y todos saben que un lanzamiento r谩pido de una soluci贸n significa una ventaja competitiva.
Github, Stackoverflow, la documentaci贸n abierta y los est谩ndares permiten lanzar en cuesti贸n de semanas lo que anteriormente requerir铆a muchos a帽os de experiencia en diversos campos del conocimiento de la inform谩tica.
Y, por supuesto, es especialmente agradable que la comunidad de apodos 1C salga de su mundo cerrado cada a帽o y se fusione con la TI global. Por ejemplo, "1C: Enterprise" hoy es uno de los idiomas oficiales admitidos por Github, y las personas de la comunidad 1C lo "ense帽aron" a este idioma. Esta historia probablemente merece un art铆culo separado, tal vez alg煤n d铆a la escriba. Mientras tanto, 隆todo lo mejor y buena suerte!
Gracias por tu tiempo!