{"id":95804,"date":"2020-10-03T13:42:27","date_gmt":"2020-10-03T11:42:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit"},"modified":"2020-10-03T13:42:27","modified_gmt":"2020-10-03T11:42:27","slug":"istoriya-arhitektury-dodo-is-rannij-monolit","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","title":{"rendered":"Historia de la arquitectura Dodo IS: el monolito temprano","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>O cada empresa infeliz con un monolito es infeliz a su manera.<\/p>\n<p>El desarrollo del sistema Dodo IS comenz\u00f3 al mismo tiempo que la empresa Dodo Pizza, en 2011. La idea base era la digitalizaci\u00f3n completa y total de los procesos empresariales, de hecho, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>por nuestros propios medios<\/u><\/a><\/noindex>, lo que ya en 2011 generaba muchas preguntas y escepticismo. Pero han pasado 9 a\u00f1os y seguimos este camino, con un desarrollo propio que comenz\u00f3 con un monolito.<\/p>\n<p>Este art\u00edculo es una \"respuesta\" a las preguntas: \"\u00bfPor qu\u00e9 reescribir la arquitectura y hacer cambios tan amplios y prolongados?\" al art\u00edculo anterior <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\"La historia de la arquitectura Dodo IS: el camino del backend\".<\/u><\/a><\/noindex>Comenzar\u00e9 con c\u00f3mo se inici\u00f3 el desarrollo de Dodo IS, c\u00f3mo era la arquitectura original, c\u00f3mo aparec\u00edan nuevos m\u00f3dulos y debido a qu\u00e9 problemas se realizaron cambios a gran escala.<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>La serie de art\u00edculos \"\u00bfQu\u00e9 es Dodo IS?\" hablar\u00e1 sobre:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>El monolito temprano en Dodo IS (2011-2015). (Est\u00e1s aqu\u00ed)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">El camino del backend: bases separadas y bus.<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>El camino de la parte del cliente: fachada sobre la base (2016-2017). (En progreso...)<\/p>\n<\/li>\n<li>\n<p>La historia de los verdaderos microservicios. (2018-2019). (En progreso...)<\/p>\n<\/li>\n<li>\n<p>La ruptura completada del monolito y estabilizaci\u00f3n de la arquitectura. (En progreso...)<\/p>\n<\/li>\n<\/ol>\n<h3>Arquitectura original<\/h3>\n<p>En 2011, la arquitectura de Dodo IS se ve\u00eda as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>El primer m\u00f3dulo en la arquitectura era la recepci\u00f3n de pedidos. El proceso de negocio era el siguiente:<\/p>\n<ul>\n<li>\n<p>el cliente llama a la pizzer\u00eda;<\/p>\n<\/li>\n<li>\n<p>el gerente contesta;<\/p>\n<\/li>\n<li>\n<p>toma el pedido por tel\u00e9fono;<\/p>\n<\/li>\n<li>\n<p>mientras introduce el pedido en la interfaz de recepci\u00f3n de pedidos: se considera la informaci\u00f3n sobre el cliente, los datos del pedido y la direcci\u00f3n de entrega.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>La interfaz del sistema de informaci\u00f3n se ve\u00eda aproximadamente as\u00ed...<\/p>\n<p>La primera versi\u00f3n de octubre de 2011:<\/p>\n<p><center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f75cfa9779ba700bea78afc\" frameborder=\"0\" allowfullscreen><\/iframe><\/center>Un poco mejorada en enero de 2012.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/h2Cdht01gDA\">Sistema de informaci\u00f3n Dodo Pizza Delivery Pizza Restaurant<\/a><\/noindex><\/p>\n<p>Los recursos para desarrollar el primer m\u00f3dulo de recepci\u00f3n de pedidos eran limitados. Era necesario hacer mucho, r\u00e1pidamente y con un peque\u00f1o equipo. Un equipo peque\u00f1o significa 2 desarrolladores, quienes sentaron las bases de todo el sistema futuro.<\/p>\n<p>Su primera decisi\u00f3n determin\u00f3 el futuro del stack tecnol\u00f3gico:<\/p>\n<ul>\n<li>\n<p>Backend en ASP.NET MVC, lenguaje C#. Los desarrolladores eran programadores de .NET, este stack les era familiar y agradable. <\/p>\n<\/li>\n<li>\n<p>Frontend en Bootstrap y JQuery: interfaces de usuario con estilos y scripts personalizados.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Base de datos MySQL: sin costos de licencias, f\u00e1cil de usar.<\/p>\n<\/li>\n<li>\n<p>Servidores en Windows Server, porque .NET en ese momento solo pod\u00eda estar en Windows (no discutiremos Mono).<\/p>\n<\/li>\n<\/ul>\n<p>F\u00edsicamente, todo esto se tradujo en \"dedicado con el proveedor de hosting\".&nbsp;<\/p>\n<h4>Arquitectura de la aplicaci\u00f3n de recepci\u00f3n de pedidos<\/h4>\n<p>Entonces, todos ya hablaban de microservicios, y SOA se utiliz\u00f3 durante unos 5 a\u00f1os en grandes proyectos, por ejemplo, WCF se lanz\u00f3 en 2006. Pero en ese momento se eligi\u00f3 una soluci\u00f3n confiable y probada.<\/p>\n<p>Aqu\u00ed est\u00e1.<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/688da7d4e02a6310bf7d2da1b767fe10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asp.Net MVC es Razor, que devuelve una p\u00e1gina HTML bajo demanda desde un formulario o del cliente, con renderizado en el servidor. En el cliente, ya CSS y scripts JS muestran la informaci\u00f3n y, si es necesario, realizan solicitudes AJAX a trav\u00e9s de JQuery.<\/p>\n<p>Las solicitudes en el servidor llegan a las clases *Controller, donde el m\u00e9todo procesa y genera la p\u00e1gina HTML final. Los controladores hacen solicitudes al nivel de l\u00f3gica, llamado *Services. Cada uno de los servicios se encargaba de un aspecto del negocio:<\/p>\n<ul>\n<li>\n<p>Por ejemplo, DepartmentStructureService proporcionaba informaci\u00f3n sobre pizzer\u00edas y departamentos. Un departamento es un grupo de pizzer\u00edas bajo la gesti\u00f3n de un solo franquiciado.<\/p>\n<\/li>\n<li>\n<p>ReceivingOrdersService aceptaba y calculaba la composici\u00f3n del pedido.<\/p>\n<\/li>\n<li>\n<p>Y SmsService enviaba SMS, llamando a los servicios API para el env\u00edo de SMS.<\/p>\n<\/li>\n<\/ul>\n<p>Los servicios procesaban datos de la base de datos, almacenaban l\u00f3gica de negocio. Cada servicio ten\u00eda uno o varios *Repository con nombres correspondientes. All\u00ed estaban las consultas a los procedimientos almacenados en la base y la capa de mapeadores. La l\u00f3gica de negocio estaba en los procedimientos almacenados, especialmente en los que generaban datos de informe. No se utiliz\u00f3 ORM, todos confiaban en SQL escrito a mano.&nbsp;<\/p>\n<p>Tambi\u00e9n hab\u00eda una capa de modelo de dominio y clases comunes de ayuda, por ejemplo, la clase Order, que almacenaba el pedido. All\u00ed, en la capa, hab\u00eda un ayudante para la conversi\u00f3n de texto de visualizaci\u00f3n seg\u00fan la moneda seleccionada.<\/p>\n<p>Todo esto se puede representar con el siguiente modelo: <\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Ruta del pedido<\/h4>\n<p>Veamos el camino simplificado inicial para crear un pedido como ese.<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Inicialmente, el sitio era est\u00e1tico. Ten\u00eda precios y arriba un n\u00famero de tel\u00e9fono y la frase \"\u00bfQuieres pizza? Llama al n\u00famero y pide\". Para hacer un pedido, necesitamos implementar un flujo simple:&nbsp;<\/p>\n<ul>\n<li>\n<p>El cliente accede al sitio est\u00e1tico con precios, elige productos y llama al n\u00famero indicado en el sitio.<\/p>\n<\/li>\n<li>\n<p>El cliente menciona los productos que desea agregar al pedido.<\/p>\n<\/li>\n<li>\n<p>Dice su direcci\u00f3n y nombre.<\/p>\n<\/li>\n<li>\n<p>El operador acepta el pedido.<\/p>\n<\/li>\n<li>\n<p>El pedido se muestra en la interfaz de pedidos recibidos.<\/p>\n<\/li>\n<\/ul>\n<p>Todo comienza con la visualizaci\u00f3n del men\u00fa. Un usuario operador autenticado solo puede aceptar un pedido a la vez. Por lo tanto, el carrito en borrador puede almacenarse en su sesi\u00f3n (la sesi\u00f3n del usuario se mantiene en la memoria). All\u00ed se encuentra el objeto Cart, que contiene los productos y la informaci\u00f3n del cliente.<\/p>\n<p>El cliente menciona el producto, el operador hace clic en <code>+<\/code> junto al producto, y se env\u00eda una solicitud al servidor. Se extrae informaci\u00f3n del producto de la base de datos y se a\u00f1ade a la cesta.<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Nota<\/strong>. S\u00ed, en este caso no es necesario extraer el producto de la base de datos, se puede enviar desde el frontend. Pero por claridad, he mostrado el camino desde la base de datos.&nbsp;<\/p>\n<p>A continuaci\u00f3n, ingresamos la direcci\u00f3n y el nombre del cliente.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Al hacer clic en \"Crear pedido\":<\/p>\n<ul>\n<li>\n<p>Enviamos la solicitud a OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>Obtenemos el Cart de la sesi\u00f3n, donde est\u00e1n los productos en la cantidad que necesitamos.<\/p>\n<\/li>\n<li>\n<p>Complementamos el Cart con la informaci\u00f3n del cliente y la enviamos al m\u00e9todo AddOrder de la clase ReceivingOrderService, donde se guarda en la base de datos.&nbsp;<\/p>\n<\/li>\n<li>\n<p>En la base de datos hay tablas para el pedido, los productos del pedido y el cliente, todas vinculadas entre s\u00ed.<\/p>\n<\/li>\n<li>\n<p>La interfaz de visualizaci\u00f3n del pedido obtiene y refleja los \u00faltimos pedidos.<\/p>\n<\/li>\n<\/ul>\n<h4>Nuevos m\u00f3dulos<\/h4>\n<p>La toma de pedidos era importante y necesaria. No se puede hacer un negocio de venta de pizzas si no hay una manera de aceptar pedidos. Por eso el sistema comenz\u00f3 a desarrollarse con funcionalidades adicionales entre 2012 y 2015. Durante ese tiempo aparecieron muchos bloques diferentes en el sistema, que llamar\u00e9 <strong>m\u00f3dulos<\/strong>, en contraposici\u00f3n a la noci\u00f3n de servicio o producto.&nbsp;<\/p>\n<p>Un m\u00f3dulo es un conjunto de funciones que est\u00e1n unidas por un objetivo comercial com\u00fan. Al mismo tiempo, f\u00edsicamente est\u00e1n en una sola aplicaci\u00f3n.<\/p>\n<p>Los m\u00f3dulos pueden considerarse bloques del sistema. Por ejemplo, hay un m\u00f3dulo de informes, interfaces de administraci\u00f3n, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>un rastreador de productos en la cocina<\/u><\/a><\/noindex>, autorizaci\u00f3n. Todas estas son diferentes interfaces para el usuario, algunas incluso tienen estilos visuales variados. Sin embargo, todas est\u00e1n dentro de una sola aplicaci\u00f3n, un solo proceso operativo.&nbsp;<\/p>\n<p>T\u00e9cnicamente, los m\u00f3dulos se estructuraron como \u00c1reas (esta idea se ha mantenido en <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/mvc\/controllers\/areas?view=aspnetcore-3.1\"><u>asp.net core<\/u><\/a><\/noindex>). Hab\u00eda archivos separados para el frontend, modelos, as\u00ed como sus propias clases de controladores. Como resultado, el sistema se transform\u00f3 de tal manera...<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>...a esta:<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Algunos m\u00f3dulos se implementaron como sitios separados (proyecto ejecutable), debido a funcionalidad completamente distinta y en parte por un desarrollo m\u00e1s enfocado y separado. Estos son:<\/p>\n<ul>\n<li>\n<p><strong>Site<\/strong> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2013\/08\/06\/new_site_dodopizza_ru\/\"><u>la primera versi\u00f3n<\/u><\/a><\/noindex> del sitio dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Exportar<\/strong>: exportaci\u00f3n de informes desde Dodo IS para 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Personal<\/strong> \u2014 \u00e1rea personal del empleado. Se desarroll\u00f3 por separado y tiene su propio acceso y dise\u00f1o.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 proyecto para el alojamiento de est\u00e1ticos. Posteriormente, nos alejamos de \u00e9l, trasladando todos los est\u00e1ticos a CDN Akamai.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Los dem\u00e1s bloques se encontraban en la aplicaci\u00f3n BackOffice.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Explicaci\u00f3n sobre los nombres:<\/p>\n<ul>\n<li>\n<p>Cashier \u2014 Caja del restaurante.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 interfaces para el rol de \"Gerente de turno\": estad\u00edsticas operativas sobre las ventas de la pizzer\u00eda, opci\u00f3n de poner productos en la lista negra, modificar pedidos.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 interfaces para los roles de \"Gerente de pizzer\u00eda\" y \"Franquiciado\". Aqu\u00ed se re\u00fanen las funciones de configuraci\u00f3n de la pizzer\u00eda, sus promociones, gesti\u00f3n del personal, informes.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 interfaces para televisores y tabletas en las pizzer\u00edas. En los televisores se muestra el men\u00fa, informaci\u00f3n publicitaria y el estado del pedido al ser entregado.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Utilizaban una capa com\u00fan de servicios, un bloque com\u00fan de clases de dominio Dodo.Core, as\u00ed como una base de datos compartida. A veces tambi\u00e9n pod\u00edan intercambiar informaci\u00f3n entre s\u00ed. Incluyendo que sitios web espec\u00edficos como dodopizza.ru o personal.dodopizza.ru acced\u00edan a los servicios comunes.<\/p>\n<p>Al aparecer nuevos m\u00f3dulos, se intentaba reutilizar al m\u00e1ximo el c\u00f3digo de los servicios, procedimientos almacenados y tablas en la base de datos ya creados.&nbsp;<\/p>\n<p>Para una mejor comprensi\u00f3n de la magnitud de los m\u00f3dulos realizados en el sistema, aqu\u00ed hay un esquema de 2012 con planes de desarrollo:<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Para 2015, todo lo que est\u00e1 en el esquema y m\u00e1s ya estaba en producci\u00f3n.<\/p>\n<ul>\n<li>\n<p>La recepci\u00f3n de pedidos se convirti\u00f3 en un bloque separado del Centro de Contacto, donde el pedido es aceptado por un operador.<\/p>\n<\/li>\n<li>\n<p>Aparecieron pantallas p\u00fablicas con el men\u00fa y la informaci\u00f3n, colgadas en las pizzer\u00edas.<\/p>\n<\/li>\n<li>\n<p>En la cocina hay un m\u00f3dulo que reproduce autom\u00e1ticamente el mensaje de voz \"Nueva pizza\" cuando llega un nuevo pedido, y tambi\u00e9n imprime un recibo para el repartidor. Esto simplifica mucho los procesos en la cocina, permitiendo a los empleados no distraerse con una gran cantidad de operaciones simples.<\/p>\n<\/li>\n<li>\n<p>El bloque de entrega se convirti\u00f3 en una Caja de Entrega separada, donde el pedido se entregaba al repartidor, que previamente hab\u00eda comenzado su turno. Se tuvo en cuenta su tiempo de trabajo para calcular su salario.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Entre 2012 y 2015, m\u00e1s de 10 desarrolladores se unieron, se abrieron 35 pizzer\u00edas, se implement\u00f3 un sistema en Ruman\u00eda y se prepar\u00f3 la apertura de locales en EE.UU. Los desarrolladores ya no asum\u00edan todas las tareas, sino que se dividieron en equipos, cada uno especializado en su parte del sistema.&nbsp;<\/p>\n<h3>Problemas<\/h3>\n<p>Incluido debido a la arquitectura (pero no solo).<\/p>\n<h4>Caos en la base de datos<\/h4>\n<p>Una sola base de datos es conveniente. Se puede lograr consistencia, adem\u00e1s de aprovechar herramientas integradas en bases de datos relacionales. Trabajar con ella es familiar y c\u00f3modo, especialmente si hay pocas tablas y pocos datos.<\/p>\n<p>Pero tras 4 a\u00f1os de desarrollo, la base cuenta con alrededor de 600 tablas y 1500 procedimientos almacenados, muchos de los cuales inclu\u00edan l\u00f3gica. Lamentablemente, los procedimientos almacenados no ofrecen ventajas significativas cuando se trabaja con MySQL. No son almacenados en cach\u00e9 por la base de datos, y almacenar l\u00f3gica en ellos complica el desarrollo y la depuraci\u00f3n. Tambi\u00e9n dificulta la reutilizaci\u00f3n del c\u00f3digo.<\/p>\n<p><strong>Muchas tablas carec\u00edan de \u00edndices adecuados.<\/strong>Por otro lado, hab\u00eda tablas con demasiados \u00edndices, lo que dificultaba la inserci\u00f3n. Era necesario modificar aproximadamente 20 tablas; la transacci\u00f3n para crear un pedido podr\u00eda tardar entre 3 y 5 segundos.&nbsp;<\/p>\n<p><strong>Los datos en las tablas no siempre estaban en la forma m\u00e1s adecuada.<\/strong>En algunos casos era necesario desnormalizar. Parte de los datos que se recib\u00edan regularmente se almacenaba en una columna como estructura XML, lo que aumentaba el tiempo de ejecuci\u00f3n, alargaba las consultas y complicaba el desarrollo.<\/p>\n<p>Se realizaban muy <strong>diversas consultas a las mismas tablas.<\/strong>Las tablas populares, como la mencionada <em>orders<\/em> o la tabla <em>pizzeria<\/em>, se utilizaban para mostrar interfaces operativas en la cocina y para an\u00e1lisis. Tambi\u00e9n las consultaba el sitio web (<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>), donde, en cualquier momento, pod\u00edan llegar repentinamente muchas solicitudes.&nbsp;<\/p>\n<p><strong>Los datos no estaban agregados<\/strong> y muchos c\u00e1lculos se realizaban en tiempo real a trav\u00e9s de la base de datos. Esto generaba c\u00e1lculos innecesarios y una carga adicional.&nbsp;<\/p>\n<p>A menudo, el c\u00f3digo acced\u00eda a la base de datos cuando no era necesario. En algunos casos faltaban operaciones por lotes, y en otros era necesario descomponer una consulta en varias a trav\u00e9s del c\u00f3digo para acelerar y aumentar la confiabilidad.&nbsp;<\/p>\n<h4>Conexi\u00f3n y enredo en el c\u00f3digo.<\/h4>\n<p><strong>Los m\u00f3dulos que deb\u00edan encargarse de su \u00e1rea de negocio no cumpl\u00edan su funci\u00f3n de manera honesta.<\/strong>. Algunos de ellos ten\u00edan funciones duplicadas para roles. Por ejemplo, un marketero local, que es responsable de la actividad de marketing de la red en su ciudad, ten\u00eda que usar tanto la interfaz de \"Admin\" (para crear promociones) como la interfaz de \"Office Manager\" (para ver el impacto de las promociones en el negocio). Claro, dentro ambos m\u00f3dulos utilizaban un \u00fanico servicio que gestionaba las promociones.<\/p>\n<p>Los servicios (clases dentro de un gran proyecto monol\u00edtico) pod\u00edan llamarse entre s\u00ed para enriquecer sus datos.<\/p>\n<p>Con las propias clases modelo, que almacenan los datos, <strong>el trabajo en el c\u00f3digo se realizaba de diversas maneras<\/strong>. En algunos lugares hab\u00eda constructores a trav\u00e9s de los cuales se pod\u00edan especificar campos obligatorios. En otros, esto se hac\u00eda a trav\u00e9s de propiedades p\u00fablicas. Por supuesto, la obtenci\u00f3n y transformaci\u00f3n de datos de la base de datos era variada.&nbsp;<\/p>\n<p><strong>La l\u00f3gica estaba ya sea en los controladores o en las clases de servicios.<\/strong>&nbsp;<\/p>\n<p>Esto parecen ser problemas menores, pero ralentizaban mucho el desarrollo y disminu\u00edan la calidad, lo que llevaba a inestabilidad y errores.&nbsp;<\/p>\n<h4>La complejidad de un gran desarrollo<\/h4>\n<p><strong>Las dificultades tambi\u00e9n surgieron durante el desarrollo<\/strong>. Era necesario crear diferentes bloques del sistema, y adem\u00e1s, de manera paralela. Conciliar las necesidades de cada componente en un \u00fanico c\u00f3digo se volv\u00eda cada vez m\u00e1s dif\u00edcil. No era f\u00e1cil llegar a un acuerdo y satisfacer a todos los componentes al mismo tiempo. Adem\u00e1s, se agregaban limitaciones en las tecnolog\u00edas, especialmente en lo que respecta a la base y el frontend. Se deb\u00eda abandonar JQuery en favor de marcos de alto nivel, especialmente en partes de servicios del cliente (sitio web).<\/p>\n<p><strong>En algunas partes del sistema podr\u00edan haberse utilizado bases de datos m\u00e1s adecuadas para esto<\/strong>. Por ejemplo, m\u00e1s tarde tuvimos un caso de transici\u00f3n de Redis a CosmosDB para el almacenamiento del carrito de pedidos.&nbsp;<\/p>\n<p>Los equipos y desarrolladores que trabajaban en su \u00e1rea realmente quer\u00edan m\u00e1s autonom\u00eda para sus servicios, tanto en t\u00e9rminos de desarrollo como de implementaci\u00f3n. Los conflictos al fusionar, problemas en los lanzamientos. Si para 5 desarrolladores este problema no era significativo, con 10, y mucho m\u00e1s con el crecimiento planificado, todo se volvi\u00f3 m\u00e1s serio. Y por delante estaba el desarrollo de una aplicaci\u00f3n m\u00f3vil (que comenz\u00f3 en 2017, y en 2018 se hizo) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">una gran ca\u00edda<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>Diferentes partes del sistema requer\u00edan diferentes indicadores de estabilidad<\/strong>, pero debido a la fuerte interconexi\u00f3n del sistema, no pudimos garantizarlo. Un error al desarrollar una nueva funci\u00f3n en el panel de administraci\u00f3n podr\u00eda haber influido en la recepci\u00f3n de pedidos en el sitio web, ya que el c\u00f3digo es com\u00fan y reutilizable, y la base y los datos tambi\u00e9n son los mismos.<\/p>\n<p>Probablemente, en el marco de una arquitectura monol\u00edtica-m\u00f3dular se podr\u00edan haber evitado estos errores y problemas: separando responsabilidades, realizando refactorizaciones tanto del c\u00f3digo como de la base de datos, separando claramente las capas, y controlando la calidad todos los d\u00edas. Sin embargo, las decisiones arquitect\u00f3nicas elegidas y el enfoque en la r\u00e1pida expansi\u00f3n de las funcionalidades del sistema llevaron a problemas de estabilidad.<\/p>\n<h4>C\u00f3mo el blog La Fuerza de la Mente afect\u00f3 los ingresos en los restaurantes.<\/h4>\n<p>Si el crecimiento de la cadena de pizzer\u00edas (y la carga) hubiera continuado al mismo ritmo, en alg\u00fan momento las ca\u00eddas habr\u00edan sido tan severas que el sistema no se habr\u00eda recuperado. Una historia que ilustra bien los problemas que empezamos a enfrentar en 2015.&nbsp;<\/p>\n<p>En el blog \u201c<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>La Fuerza de la Mente<\/u><\/a><\/noindex>\u201d hab\u00eda un widget que mostraba datos sobre los ingresos anuales de toda la red. El widget acced\u00eda a la API p\u00fablica de Dodo, que proporciona estos datos. Ahora, esta estad\u00edstica est\u00e1 disponible en <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. El widget se mostraba en cada p\u00e1gina y hac\u00eda solicitudes cada 20 segundos. La solicitud iba a api.dodopizza.ru y solicitaba:<\/p>\n<ul>\n<li>\n<p>el n\u00famero de pizzer\u00edas en la cadena;<\/p>\n<\/li>\n<li>\n<p>los ingresos totales de la cadena desde el inicio del a\u00f1o;<\/p>\n<\/li>\n<li>\n<p>los ingresos del d\u00eda de hoy.<\/p>\n<\/li>\n<\/ul>\n<p>La solicitud de estad\u00edsticas de ingresos iba directamente a la base de datos y comenzaba a solicitar datos sobre los pedidos, agregando informaci\u00f3n en tiempo real y proporcionando la suma.&nbsp;<\/p>\n<p>En esta misma tabla de pedidos, las cajas de los restaurantes descargaban la lista de pedidos aceptados del d\u00eda y se a\u00f1ad\u00edan los nuevos pedidos. Las cajas hac\u00edan sus solicitudes cada 5 segundos o con la actualizaci\u00f3n de la p\u00e1gina.<\/p>\n<p>El esquema era el siguiente:<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Una vez en oto\u00f1o, Fyodor Ovchinnikov escribi\u00f3 una larga y popular entrada en su blog. Mucha gente visit\u00f3 el blog y comenz\u00f3 a leer atentamente todo. Mientras cada persona que lleg\u00f3 le\u00eda el art\u00edculo, el widget de ingresos funcionaba correctamente y solicitaba la API cada 20 segundos.<\/p>\n<p>La API invoc\u00f3 un procedimiento almacenado para calcular la suma de todos los pedidos desde el inicio del a\u00f1o en todas las pizzer\u00edas de la red. La agregaci\u00f3n se realiz\u00f3 sobre la tabla orders, que es muy popular. En ella ingresan todas las cajas de todos los restaurantes abiertos en ese momento. Las cajas dejaron de responder, no se aceptaban pedidos. Tambi\u00e9n, no se aceptaban desde el sitio web, no aparec\u00edan en el rastreador, el gerente de turno no pod\u00eda verlos en su interfaz.&nbsp;<\/p>\n<p>Esta no es la \u00fanica historia. Para el oto\u00f1o de 2015, la carga del sistema era cr\u00edtica todos los viernes. Varias veces apagamos la API p\u00fablica, y una vez, incluso tuvimos que desconectar el sitio, porque ya nada funcionaba. Exist\u00eda incluso una lista de servicios con un orden de desconexi\u00f3n en caso de cargas graves.<\/p>\n<p>Desde este momento comienza nuestra lucha contra las cargas y por la estabilizaci\u00f3n del sistema (desde el oto\u00f1o de 2015 hasta el oto\u00f1o de 2018). Fue entonces cuando ocurri\u00f3 el \u201c<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Gran colapso<\/u><\/a><\/noindex>\u201d. Luego, tambi\u00e9n ocurrieron fallos de vez en cuando, algunos fueron bastante sensibles, pero el per\u00edodo general de inestabilidad ahora se puede considerar superado.<\/p>\n<h4>Crecimiento acelerado del negocio<\/h4>\n<p>\u00bfPor qu\u00e9 no se pudo \"hacerlo bien desde el principio\"? Basta con mirar los siguientes gr\u00e1ficos.<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tambi\u00e9n en 2014-2015 se abri\u00f3 en Ruman\u00eda y se preparaba la apertura en EE. UU.<\/p>\n<p>La red creci\u00f3 muy r\u00e1pido, se abrieron nuevos pa\u00edses, aparecieron nuevos formatos de pizzer\u00edas, por ejemplo, se abri\u00f3 una pizzer\u00eda en un food court. Todo esto requer\u00eda una atenci\u00f3n significativa a la expansi\u00f3n de las funciones de Dodo IS. Sin todas estas funciones, sin rastreo en la cocina, control de productos y p\u00e9rdidas en el sistema, visualizaci\u00f3n del pedido en el \u00e1rea del food court, dif\u00edcilmente estar\u00edamos hablando ahora de una arquitectura \"correcta\" y un enfoque \"adecuado\" para el desarrollo.<\/p>\n<p>Otro obst\u00e1culo para la revisi\u00f3n oportuna de la arquitectura y, en general, para la atenci\u00f3n a los problemas t\u00e9cnicos, fue la crisis de 2014. Estas cosas afectan dolorosamente las oportunidades de crecimiento de los equipos, especialmente para un negocio joven como lo era Dodo Pizza.<\/p>\n<h3>Soluciones r\u00e1pidas que ayudaron<\/h3>\n<p>Los problemas requer\u00edan soluciones. Condicionalmente, las soluciones se pueden dividir en 2 grupos:<\/p>\n<ul>\n<li>\n<p>R\u00e1pidas, que apagan el fuego y dan un peque\u00f1o margen de supervivencia, y nos ganan tiempo para hacer cambios.<\/p>\n<\/li>\n<li>\n<p>Sist\u00e9micas y, por lo tanto, largas. Reingenier\u00eda de varios m\u00f3dulos, separaci\u00f3n de la arquitectura monol\u00edtica en servicios separados (la mayor\u00eda de ellos no son micro, sino m\u00e1s bien macroservicios y sobre esto hay <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>informe de Andrey Morevsky<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>La lista de cambios r\u00e1pidos es la siguiente:<\/p>\n<h4>Escalar maestra de la base<\/h4>\n<p>Por supuesto, lo primero que se hace para combatir las cargas es aumentar la potencia del servidor. Esto se realiz\u00f3 tanto para la maestra de la base como para los servidores web. Lamentablemente, esto solo es posible hasta cierto l\u00edmite, despu\u00e9s se vuelve demasiado costoso.<\/p>\n<p>Desde 2014, nos mudamos a Azure, sobre esto tambi\u00e9n escribimos en aquel momento en el art\u00edculo \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">C\u00f3mo Dodo Pizza entrega pizza con la nube de Microsoft Azure<\/a><\/noindex>\u00bb. Pero despu\u00e9s de una serie de aumentos en los servidores de la base, nos encontramos con l\u00edmites de costos.&nbsp;<\/p>\n<h4>R\u00e9plicas de la base para lectura<\/h4>\n<p>Se hicieron dos r\u00e9plicas para la base:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>para consultas sobre directorios<\/strong>. Se utiliza para la lectura de directorios, como ciudades, calles, pizzer\u00edas, productos (dominio de cambios lentos), y en aquellas interfaces donde se permite un peque\u00f1o retraso. Estas r\u00e9plicas eran 2, y aseguramos su disponibilidad igual que la de la maestra.<\/p>\n<p><strong>ReadReplica para consultas sobre informes<\/strong>. Esta base ten\u00eda menor disponibilidad, pero en ella se realizaban todos los informes. Aunque tienen consultas pesadas sobre enormes rec\u00e1lculos de datos, no afectan a la base principal ni a las interfaces operativas.&nbsp;<\/p>\n<h4>Cach\u00e9s en el c\u00f3digo<\/h4>\n<p>No hab\u00eda cach\u00e9s en el c\u00f3digo en ninguna parte (en absoluto). Esto llevaba a consultas adicionales, no siempre necesarias, en la base sobrecargada. Las cach\u00e9s estaban inicialmente tanto en memoria como en un servicio de cach\u00e9 externo, que era Redis. Todo se invalidaba por tiempo, y las configuraciones se indicaban en el c\u00f3digo.<\/p>\n<h4>Varios servidores para el backend<\/h4>\n<p>El backend de la aplicaci\u00f3n tambi\u00e9n necesitaba ser escalado para soportar las cargas incrementadas. Era necesario convertir de un servidor IIS a un cl\u00faster. Migramos <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>la sesi\u00f3n de aplicaciones<\/u><\/a><\/noindex> de la memoria a RedisCache, lo que permiti\u00f3 establecer varios servidores detr\u00e1s de un simple equilibrador de carga con round robin. Inicialmente se utiliz\u00f3 el mismo Redis que para las cach\u00e9s, luego se distribuyeron en varios.&nbsp;<\/p>\n<p>En \u00faltima instancia, la arquitectura se complic\u00f3...<\/p>\n<p><img decoding=\"async\" alt=\"Historia de la arquitectura Dodo IS: el monolito temprano\" src=\"\/wp-content\/uploads\/2020\/10\/70a3e8d5578469239c08b4759ab32264.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>...pero se logr\u00f3 aliviar parte de la tensi\u00f3n.<\/p>\n<p>Y luego hab\u00eda que rehacer los componentes sobrecargados, lo que nosotros afrontamos. Hablaremos de esto en la siguiente parte.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/521614\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0430\u043b\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u0438 \u0442\u043e\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0446\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438, \u0447\u0442\u043e \u0435\u0449\u0435 \u0442\u043e\u0433\u0434\u0430 \u0432 2011 \u0433\u043e\u0434\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0441\u043a\u0435\u043f\u0442\u0438\u0446\u0438\u0437\u043c\u0430. \u041d\u043e \u0432\u043e\u0442 \u0443\u0436\u0435 9 \u043b\u0435\u0442 \u043c\u044b \u0438\u0434\u0435\u043c \u043f\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95805,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95804","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Dodo IS: \u0440\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-03T11:42:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-03T11:42:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Historia de la arquitectura Dodo IS: monolito temprano | ProHoster","description":"O cada empresa desafortunada con un monolito es infeliz a su manera. El desarrollo del sistema Dodo IS comenz\u00f3 inmediatamente con el negocio de Dodo Pizza \u2014 en 2011.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Dodo IS: \u0440\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 | ProHoster","og:description":"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-03T11:42:27+00:00","article:modified_time":"2020-10-03T11:42:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95804","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:57:47","updated":"2022-09-28 00:34:07","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/95804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=95804"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/95804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/95805"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=95804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=95804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=95804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}