<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Thu, 13 May 2021 01:55:01 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.17</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Datalake una nueva forma de análisis de datos</title>
		<link>https://www.oscarblancarteblog.com/2021/05/13/datalake-una-nueva-forma-de-analisis-de-datos/</link>
					<comments>https://www.oscarblancarteblog.com/2021/05/13/datalake-una-nueva-forma-de-analisis-de-datos/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 13 May 2021 01:46:56 +0000</pubDate>
				<category><![CDATA[EAI]]></category>
		<category><![CDATA[Base de datos]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=3326</guid>

					<description><![CDATA[<p>Los lagos de datos son repositorios donde las aplicaciones dejan su información en bruto para poder ser analizados y explotados</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2021/05/13/datalake-una-nueva-forma-de-analisis-de-datos/">Datalake una nueva forma de análisis de datos</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="577" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/banner-1024x577.jpg" alt="" class="wp-image-3336" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/banner-1024x577.jpg 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/banner-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/banner-768x433.jpg 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/banner.jpg 1196w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>No es un secreto que las aplicaciones de hoy en día generan una gran cantidad de datos y sumado a eso, cada vez tenemos más aplicaciones independientes que van produciendo datos de forma aislada, por tal motivo, llegara un momento en que los datos están distribuidos en varias base de datos, por lo que recuperar información relevante y consistente, nos obliga a crear complejos procesos de extracción y cargado de datos (ETL) para integrarlos en una única fuente confiable para finalmente sea analizada y explotable, sin embargo, como analizaremos en este artículo, este enfoque tiene grandes problemas, entre los que destaca los complicados procesos de extracción y los múltiples procesos ETL que deben de correr una y otra vez para obtener diferente información para diferentes análisis o reportes.</p>



<span id="more-3326"></span>



<h1>Antecedentes</h1>



<p>Cuando las herramientas como Business Intelligence (BI) comenzaron a ponerse de moda, predominaban las aplicaciones monolíticas, donde cada aplicación podía contener una gran cantidad de información sobre una parte del negocio:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="954" height="371" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/1-datalake-db-por-aplicacion.png" alt="Datalake una nueva forma de análisis de datos" class="wp-image-3328" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/1-datalake-db-por-aplicacion.png 954w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/1-datalake-db-por-aplicacion-300x117.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/1-datalake-db-por-aplicacion-768x299.png 768w" sizes="(max-width: 954px) 100vw, 954px" /></figure>



<p>Debido a que los sistemas eran grandes silos datos, era muy simple crear procesos ETL para extraer información de estos sistemas y crear los famosos Data warehouses o almacenes de datos, desde los cuales las herramientas de BI generaban sus reportes:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="916" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/2-datalake-db-por-aplicacion-etl-1024x916.png" alt="Datalake una nueva forma de análisis de datos" class="wp-image-3329" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/2-datalake-db-por-aplicacion-etl-1024x916.png 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/2-datalake-db-por-aplicacion-etl-300x268.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/2-datalake-db-por-aplicacion-etl-768x687.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/2-datalake-db-por-aplicacion-etl.png 1053w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>A pesar de que esto es suficiente para muchas empresas, el problema llega cuando se requieren reportes más complejos, donde la información se recolecta de múltiples sistemas para generar un solo reporte, creando una sobre carga de las bases de datos transaccionales, pues múltiples procesos extraen información para diferentes almacenes de datos:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="749" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/3-datalake-db-por-aplicacion-etl-datawarehouse-1024x749.png" alt="Datalake una nueva forma de análisis de datos" class="wp-image-3330" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/3-datalake-db-por-aplicacion-etl-datawarehouse-1024x749.png 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/3-datalake-db-por-aplicacion-etl-datawarehouse-300x219.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/3-datalake-db-por-aplicacion-etl-datawarehouse-768x562.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/3-datalake-db-por-aplicacion-etl-datawarehouse.png 1266w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Lo que estamos viendo en la imagen anterior es un caso muy común que he visto en muchas empresas, donde tiene varios procesos ETL que extraen información del mismo sistema, pero como son varios procesos, los tiene que programar a diferentes horas de la noche o del día para que no corran en simultaneo.</p>



<p>Si prestamos atención en la imagen anterior, podrás observar que el ERP es utilizado por 3 procesos ETL para crear diferentes almacenes de datos, y muy probablemente los 3 procesos ETL consulten prácticamente la misma información, pero la procesen de forma diferente, entonces, como la procesan diferente según su objetivo, hace necesario crear cuantos procesos ETL sea necesario para satisfacer todas las necesidades del negocio, lo cual, queda claro que no es para nada eficiente.</p>



<h1>¿La solución es un Stagin Area?</h1>



<p>Dada la problemática anterior, quizás los más experimentados digan, bueno, pues creamos un Stagin Area en donde volquemos todos los datos y sobre esa base de datos corremos los procesos ETL. Veamos como quedaría:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="968" height="1024" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/4-datalake-db-por-aplicacion-stagingarea-968x1024.png" alt="Datalake una nueva forma de análisis de datos" class="wp-image-3331" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/4-datalake-db-por-aplicacion-stagingarea-968x1024.png 968w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/4-datalake-db-por-aplicacion-stagingarea-284x300.png 284w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/4-datalake-db-por-aplicacion-stagingarea-768x812.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/4-datalake-db-por-aplicacion-stagingarea.png 1266w" sizes="(max-width: 968px) 100vw, 968px" /></figure>



<p>En esta nueva arquitectura tenemos proceso de extracción que solo extraen los datos una vez de los sistemas transaccionales y los dejan en los Stagin Area, los cuales al nos ser transaccionales, permite que múltiples procesos ETL se conecten a ellos para extraer la información y crear sus propios almacenes de datos. Este enfoque tiene varias ventas:</p>



<ul><li>Extraemos la información una sola vez de los sistemas transaccionales.</li><li>Permite que los procesos ETL se conecten a los Stagin Area a la hora que sea sin comprometer la operatividad del negocio.</li><li>Tenemos un mejor control sobre los procesos que extraen información de los sistemas transaccionales.</li></ul>



<p>Entonces estarás pensando, listo, problema resuelto, cerremos todo y vamos a casa a descansar, sin embargo, hay una pequeña que no hemos sumado a la ecuación…. Los microservicios y las arquitecturas distribuidas, que es aquí donde todo comienza a complicarse, pues en lugar de tener grandes fuentes de datos, tenemos múltiples fuentes, donde cada una cuenta una parte de la historia y para poder tener toda la historia, necesitamos recopilar información de múltiples puntos.</p>



<h1>Datalake</h1>



<p>El problema ( o la ventaja, depende de como lo veas) es que en arquitecturas de microservicios no tenemos enormes sistemas desde los cuales obtener los datos, si no que es necesario recopilar datos de varias fuentes solo para poder crear un reporte:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="796" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/5-datalake-microservicios-1024x796.png" alt="Datalake una nueva forma de análisis de datos" class="wp-image-3332" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/5-datalake-microservicios-1024x796.png 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/5-datalake-microservicios-300x233.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/5-datalake-microservicios-768x597.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/5-datalake-microservicios.png 1333w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Bajo esta arquitectura se hace impráctico tener múltiples Stagin Area, ya que se tendrían que mantener demasiadas bases de datos, por eso, se propone los Datalake o Lagos de datos, los cuales cambian considerablemente la forma en que los datos se extraen y se procesan.</p>



<p>Un lago de datos es básicamente un vertedero donde son las mismas aplicaciones quienes dejan los datos, en lugar de ser extraídos por un proceso, por otra parte, un Datalake es único, esto quiere decir todas las aplicaciones dejan los datos en el mismo lugar. Creando un lago de datos donde los demás procesos se pueden servir.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="655" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/6-datalake-sincronizacion-1024x655.png" alt="Datalake una nueva forma de análisis de datos" class="wp-image-3333" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/6-datalake-sincronizacion-1024x655.png 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/6-datalake-sincronizacion-300x192.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/6-datalake-sincronizacion-768x491.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/6-datalake-sincronizacion.png 1213w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Este enfoque puede resultar controversial, pero a medida que avancemos en este artículo, iremos resolviendo algunas dudas que puedan surgir, así que por lo pronto, solo ve analizando esto.</p>



<p>Lo primero que debemos entender respecto al Datalake es que son las mismas aplicaciones las que deciden que información mandar al lago y el formato de la misma, por que cada aplicación es dueña de su parte del lago. De la misma forma, esta tiene la libertada de agregar, quitara o modificar la estructura de la misma, ya que cada aplicación determina que y como la información se envía al Datalake. Aunque claro, siempre será mejor no hacer cambios demasiados bruscos.</p>



<p>Otro aspecto del lago es que la información es incremental y no está procesada, esto quiere decir que los sistemas van depositando solamente la nueva información (aun que podrían borrar y cargar toda la data), pero al mismo tiempo, la información no está procesada al momento de dejarla en el lago, si no que se deja en bruto.</p>



<p>En este nuevo enfoque son los interesados los encargados en buscar que información les sirve y cual no, al mismo tiempo que se puede obtener información de múltiples aplicaciones de forma simultánea. Ha esto yo le llamo los ríos del lago, ya que cada interesado deshoja del lago la información que le sirve para su propósito para dejarla en un data warehouse ya procesada:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="948" height="1024" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/7-datalake-rios-948x1024.png" alt="Datalake una nueva forma de análisis de datos" class="wp-image-3334" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/7-datalake-rios-948x1024.png 948w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/7-datalake-rios-278x300.png 278w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/7-datalake-rios-768x829.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/05/7-datalake-rios.png 1214w" sizes="(max-width: 948px) 100vw, 948px" /></figure>



<p>Este enfoque es especialmente útil en entornos de Big Data y análisis de datos, ya que todos los sistemas van depositando la data en bruto en un mismo lugar, lo que facilita para que los científicos de datos puedan explotar la información, además, es posible contrastarla con la data de los demás sistemas.</p>



<h1>Reservas respecto a la seguridad</h1>



<p>Uno de los aspectos más cuestionados sobre este enfoque es la seguridad de los datos, ya que una persona con acceso total al lago tiene visión completa de lo que pasa en todos los sistemas, lo cual no es una observación menor, por lo que hay que tener especia cuidado sobre los accesos que damos a este. No hay una formula clara o única para resolver esto, salvo que limitar bien el acceso al lago y tener acuerdo de confidencialidad bien estipulados.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2021/05/13/datalake-una-nueva-forma-de-analisis-de-datos/">Datalake una nueva forma de análisis de datos</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2021/05/13/datalake-una-nueva-forma-de-analisis-de-datos/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3326</post-id>	</item>
		<item>
		<title>El principio de idempotencia</title>
		<link>https://www.oscarblancarteblog.com/2021/01/17/el-principio-de-idempotencia/</link>
					<comments>https://www.oscarblancarteblog.com/2021/01/17/el-principio-de-idempotencia/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Sun, 17 Jan 2021 02:13:52 +0000</pubDate>
				<category><![CDATA[EAI]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=3305</guid>

					<description><![CDATA[<p>Uno de los principales problemas en arquitecturas distribuidas es garantizar que múltiples ejecuciones con los mismos parámetros sobre el mismo recurso afectará al sistema como si se hubiera ejecutado 1 o N veces.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2021/01/17/el-principio-de-idempotencia/">El principio de idempotencia</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" width="1014" height="571" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/01/idempotencia.jpg" alt="" class="wp-image-3309" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2021/01/idempotencia.jpg 1014w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/01/idempotencia-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/01/idempotencia-768x432.jpg 768w" sizes="(max-width: 1014px) 100vw, 1014px" /></figure>



<p>Uno de los principales problemas en arquitecturas distribuidas es garantizar que múltiples ejecuciones con los mismos parámetros sobre el mismo recurso afectará al sistema como si se hubiera ejecutado 1 o N veces.</p>



<span id="more-3305"></span>



<p>En realidad la <em><a href="https://es.wikipedia.org/wiki/Idempotencia">idempotencia</a></em> es un término matemático que dice “<em>la idempotencia es la propiedad para realizar una acción determinada varias veces y aun así conseguir el mismo resultado que se obtendría si se realizase una sola vez</em>”. Sin embargo, no quiero aburrirte con matemáticas, así que lo trataremos de explicar desde el punto de vista del software.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>La importancia de la idempotencia</h2>



<p>A pesar de que el termino idempotencia no es muy conocido, los problemas que pueden producir son mucho más frecuente de los que podríamos pensar, así que para comprender mejor su importancia analicemos el siguiente caso.</p>



<p>Tenemos una aplicación móvil que levante pedidos de los clientes, por tal motivo, la aplicación la tiene instalada varios vendedores que están en la calle ofreciendo los productos. Cuando un cliente quiere comprar alguno de nuestros productos, el vendedor levante el pedido desde la aplicación y posteriormente lo envía a nuestro ERP para procesar el pedido y programar la entrega del mismo.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-large"><img loading="lazy" width="612" height="152" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/01/image.png" alt="" class="wp-image-3306" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2021/01/image.png 612w, https://www.oscarblancarteblog.com/wp-content/uploads/2021/01/image-300x75.png 300w" sizes="(max-width: 612px) 100vw, 612px" /></figure>



<p>Hasta aquí todo bien, pues es la clásica aplicación de creación de pedidos, sin embargo, un problema muy frecuente con las aplicaciones móviles es la conectividad con Internet, ya que hay zonas en las que no hay buena recepción o simplemente está no se tiene acceso al servicio, en tal caso, la aplicación lo que hace es que guarda el pedido en el celular y posteriormente lo sincroniza con el ERP.</p>



<p>Cuando la aplicación envíe el request al ERP, enviará un mensaje como el siguiente:</p>



<pre class="wp-block-code"><code class="">URL: https://myapp.com/orders
Method: POST
Headers:
   Accept: application/json
   Content-Type: application/json
Body:
{
	"customer": "oscar",
	"regDate": "2021-01-29T12:00:00Z"
	"productos": [
		{
			productId: 1,
			quantity: 10
		}
	]
}</code></pre>



<p>Y obtendrá una respuesta como la siguiente:</p>



<pre class="wp-block-code"><code class="">URL: https://myapp.com/orders
Status: 201 CREATED
Headers:
   Content-Type: application/json  
Body:
{
	"id": 1,
	"customer": "oscar",
	"regDate": "2021-01-29T12:00:00Z"
	"productos": [
		{
			productId: 1,
			quantity: 10
		}
	]
}</code></pre>



<p>Esto que estamos viendo es el escenario ideal, donde cada solicitud al servidor tiene una respuesta, sin embargo, es posible que durante el proceso de sincronización el pedido sea recibido por el ERP, pero por problemas de conectividad, la aplicación móvil no reciba la respuesta del ERP, lo que dará como resultado que el ERP creará el pedido, pero la aplicación móvil no tendrá una respuesta, por lo que el usuario asumirá que hay un problema con el envío, así que reintentará enviar nuevamente el pedido, lo que provocará que una solicitud idéntica a la anterior sea enviada al servidor, y una nueva orden sea creada en el ERP. Si este error continúa, el usuario seguirá enviando el pedido al ERP hasta tener éxito, lo que provocaría que tuviéramos N pedidos en el ERP.</p>



<p>Otro caso similar se da cuando por errores en el diseño de la aplicación,  el usuario puede presionar repetidas veces el botón de guardar sin que este se bloqué hasta recibir una respuesta. Este caso provoca que el usuario pueda enviar N veces la misma solicitud al servidor, creando también N pedido en el ERP.</p>



<figure class="wp-block-gallery columns-1 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img loading="lazy" width="240" height="138" src="https://www.oscarblancarteblog.com/wp-content/uploads/2021/01/GentleFailingHermitcrab-max-1mb.gif" alt="" data-id="3311" data-full-url="https://www.oscarblancarteblog.com/wp-content/uploads/2021/01/GentleFailingHermitcrab-max-1mb.gif" data-link="https://www.oscarblancarteblog.com/?attachment_id=3311" class="wp-image-3311"/></figure></li></ul></figure>



<p>Otro caso en el que se puede presentar este problema es cuando enviamos las solicitudes de creación por colas de mensajes (Queue), ya que no hay garantía de que un mensaje que enviemos sea entregado al destinatario, así que es posible que reenviemos el mensaje en más de una ocasión.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Cómo sortear la idempotencia</h2>



<p>Bueno, en este punto creo que ya nos queda claro el problema con aplicaciones que no tiene presente este problema, así que ahora nos enfocaremos en como evitar este problema para cumplir con el principio de la idempotencia.</p>



<p>Aunque existen varias formas de evitar este tipo de problemas, sobresalen dos técnicas que son las más utilizadas, las cuales explicamos a continuación:</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h3>Identificador Virtual</h3>



<p>Esta técnica se utiliza sobre en todos en entornos síncronos, donde el cliente se queda esperando hasta obtener la respuesta, y consiste en dos pasos.</p>



<p>El consumidor deberá solicitar al servidor la creación de un identificador virtual del objeto que va a crear, en este caso, podría tener un servicio que regresa un identificador para un pedido, de esta forma, el cliente primero solicita la creación del identificador mediante un payload vacío:</p>



<pre class="wp-block-code"><code class="">URL: https://myapp.com/orders
Method: POST
Headers:
   Accept: application/json
   Content-Type: application/json
Body:</code></pre>



<p>Como resultado, el servidor le regresará el identificador generado del lado del servidor, tal y como se muestra a continuación:</p>



<pre class="wp-block-code"><code class="">URL: https://myapp.com/orders
Status: 201 CREATED
Headers:
   Content-Type: application/json  
Body:
{
	"id": 1
}</code></pre>



<p>Ya con el identificador creado del lado del servidor, se puede procede a actualizar el pedido con el identificador retornado por el servidor mediante una segunda llamada al API:</p>



<pre class="wp-block-code"><code class="">URL: https://myapp.com/orders/1
Method: PUT
Headers:
   Accept: application/json
   Content-Type: application/json
Body:
{
	"customer": "oscar",
	"regDate": "2021-01-29T12:00:00Z"
	"productos": [
		{
			productId: 1,
			quantity: 10
		}
	]
} </code></pre>



<p>Podrás observar dos cambios significativos en este segundo request, y es que el ID del pedido ya no viaja a nivel del Payload, si no que lo enviamos como parte de la URL, ya que estamos realizando una actualización concreta sobre un pedido del cual ya conocemos el identificador.</p>



<p>El segundo cambio importante es que realizamos la llamada por el método PUT en lugar del método POST, ya que estamos actualizando el pedido.</p>



<p>Desde luego que esta estrategia plantea nuevos problemas, por ejemplo, que pasa si ejecuto el servicio para crear el identificador y no obtengo una respuesta. Este escenario sería parecido al problema original, ya que el servidor si crearía el identificador virtual, sin embargo, este solo sería un identificador y no un pedido, por lo que podríamos crear cuantos identificadores virtuales sin precisamente crear pedidos.</p>



<p>La segunda duda es, que pasaría si envío la solicitud de actualización (PUT) en más de una ocasión, pues bien, la respuesta es simple, por que solamente la estamos actualizando, por lo que si se envía en más de una ocasión solo actualizaremos el registro existente, no creando nuevos registros.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h3>Identificador Único Universal (UUID)</h3>



<p>Esta estrategia consiste en que cada objeto que es creado, debe ser asociado a un Identificado Único Universal (<a href="https://es.wikipedia.org/wiki/Identificador_%C3%BAnico_universal">UUID</a>), el cual deberá ser asignado en el momento en que un objeto es creado por primera vez, de esta forma, el sistema que crear por primera vez un objeto, será el responsable de asignar este identificador.</p>



<p>Un dato importante a resaltar es que el UUID puede ser independiente del Identificador de base de datos (llave primaria), ya que más bien, el UUID será un identificado de integración,  de tal forma que podrá ser replicado por todos los sistemas por lo que viaje, de esta forma, es posible rastrear un objeto en todos los sistemas por lo que pase.</p>



<p>En este orden de ideas, podemos ver que el flujo de creación de ordenes se ve de la siguiente forma. Cuando el usuario levante un pedido en la aplicación móvil, la misma aplicación le genera un UUD, luego, cuando quiere enviar el pedido al ERP, este lanza un request como el siguiente:</p>



<pre class="wp-block-code"><code class="">URL: https://myapp.com/orders
Method: POST
Headers:
   Accept: application/json
   Content-Type: application/json
Body:
{
	"UUID": "2da46052-584f-11eb-ae93-0242ac130002",
	"customer": "oscar",
	"regDate": "2021-01-29T12:00:00Z"
	"productos": [
		{
			productId: 1,
			quantity: 10
		}
	]
}</code></pre>



<p>Si prestamos atención en el request anterior, podemos observar dos cosas, la primera es que el request es sobre el método POST, lo que quiere decir que efectivamente estamos solicitando la creación de un nuevo pedido. El segundo punto es que estamos enviando el parámetro UUID como parte del objeto del pedido. Mas adelante analizaremos que implica todo esto, por ahora veamos el resultado de esta ejecución:</p>



<pre class="wp-block-code"><code class="">URL: https://myapp.com/orders
Status: 201 CREATED
Headers:
   Content-Type: application/json  
Body:
{
	"id": 1,
	"UUID": "2da46052-584f-11eb-ae93-0242ac130002",
	"customer": "oscar",
	"regDate": "2021-01-29T12:00:00Z"
	"productos": [
		{
			productId: 1,
			quantity: 10
		}
	]
}</code></pre>



<p>En la respuesta podemos ver que el servidor nos arrojado nuevamente el UUID que le enviamos para la creación, pero además, nos retorna el ID, lo cual puede resultar confuso, pues ahora tenemos dos Identificadores, sin embargo, cada uno juega una papel diferente, pues el Id es el identificar único del pedido en el ERP, mientras que el UUID es el identificar universal, por lo que ahora es posible relaciona el pedido en la app móvil con el del ERP mediante este identificador, además, si este pedido tiene que ser replicado del ERP a otro sistema, puede seguir usando el mismo UUID para sincronizarlo con el este tercer sistema.</p>



<p>Pero bien, pasemos a los que nos interesa, que pasa ahora si enviamos la misma solicitud más de una vez. Pues bien, si volvemos a enviar este misma solicitud al ERP, este podrá detectar que ya existe un pedido asociado con ese UUID, por lo que pueden pasar dos cosas, la primera es que marque un error al crear el pedido, indicando que el pedido ya existe, o en su lugar realizar un update del pedido, de esta forma, si la primera solicitud creo el pedido, la segunda solicitud no creará un nuevo pedido, si no más bien, solo lo actualizará, por lo que en cliente recibirá el mismo Id con cada ejecución.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Conclusiones</h2>



<p>Como hemos podido analizar el principio de idempotencia es un problema que se puede presentar muchas más veces de lo que parecería, por lo que es importante garantizar que el sistema se comporte adecuadamente aun cuando el mismo request sea enviado muchas veces, sobre todo en sistemas distribuidos.</p>



<p>También analizamos dos formas se garantizar el principio de idempotencia, y cada estrategia se podrá adecuar mejor a cada situación, sin embargo, creo que la estrategia por UUID es la mejor, ya que es mucho más simple de implementar, pero sobre todo, permite una rastreabilidad entre todos los puntos de la integración, ya sea entre dos sistemas o varios sistemas y puntos intermedios, como colas de mensajes o persistencia en base de datos.</p>



<p>Finalmente, en este artículo nos centramos en las peticiones por HTTP, como es el caso de REST, pero cabe mencionar que este problema se da con cualquier tipo de tecnología o protocolo de comunicación, por lo que no es un problema ajeno solo a REST.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2021/01/17/el-principio-de-idempotencia/">El principio de idempotencia</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2021/01/17/el-principio-de-idempotencia/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3305</post-id>	</item>
		<item>
		<title>Nuevo curso de Python</title>
		<link>https://www.oscarblancarteblog.com/2020/10/12/nuevo-curso-de-python/</link>
					<comments>https://www.oscarblancarteblog.com/2020/10/12/nuevo-curso-de-python/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 12 Oct 2020 15:02:53 +0000</pubDate>
				<category><![CDATA[cursos]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=3283</guid>

					<description><![CDATA[<p>Hola, aquí Oscar Blancarte, Estamos muy contentos por anunciar que hemos publicado el nuevo curso de Python Core Essentials, el cual busque enseñarte a utilizar Python desde cero, donde aprenderemos desde la instalación hasta terminar un proyecto final con conexión a la base de datos. Este curso está diseñado para cualquier persona, incluso si no [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/10/12/nuevo-curso-de-python/">Nuevo curso de Python</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" width="800" height="450" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/10/python-core-banner-lg.jpg" alt="" class="wp-image-3285" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/10/python-core-banner-lg.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/10/python-core-banner-lg-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/10/python-core-banner-lg-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<span id="more-3283"></span>



<p>Hola, aquí Oscar Blancarte,</p>



<p>Estamos muy contentos por anunciar que hemos publicado el nuevo curso de Python Core Essentials, el cual busque enseñarte a utilizar Python desde cero, donde aprenderemos desde la instalación hasta terminar un proyecto final con conexión a la base de datos.</p>



<p>Este curso está diseñado para cualquier persona, incluso si no tiene nada de experiencia en Python u otro lenguaje y busca que aprendas lo siguiente:</p>



<ul><li>Sintaxis básica</li><li>Ciclos y estructuras de control</li><li>Dominio de las variables y tipos de datos</li><li>Arreglos y estructuras de datos</li><li>Programación Orientada a Objectos (POO)</li><li>Conexiones con bases de datos</li><li>Introducción a los frameworks más importantes</li></ul>



<p>Todo esto lo aprenderás mediante un proyecto final que se desarrollará a lo largo del curso.</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Finalmente, déjame recordarte que ya tenemos un plan de suscripción mensual o anual, con el que podrás acceder a todos los cursos por solo 19usd al mes o puedes suscribirte todo el año pagando solo 10 meses y nosotros te regalamos los otros dos.</p>



<p>Además, ya se viene varios cursos más en los próximos días, como es el caso del curso de PHP, Arquitectura de software, C#, uso de terminales con Linux, y el curso profesional de GIT. que podrás acceder sin costo con tu suscripción.</p>



<div class="wp-block-buttons aligncenter">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link" href="https://codmind.com/courses/python" rel="">IR AL CURSO DE PYTHON</a></div>
</div>



<p></p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/10/12/nuevo-curso-de-python/">Nuevo curso de Python</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2020/10/12/nuevo-curso-de-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3283</post-id>	</item>
		<item>
		<title>Documentar un API REST con Swagger y Spring Boot</title>
		<link>https://www.oscarblancarteblog.com/2020/08/28/documentar-un-api-rest-con-swagger-y-spring-boot/</link>
					<comments>https://www.oscarblancarteblog.com/2020/08/28/documentar-un-api-rest-con-swagger-y-spring-boot/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 28 Aug 2020 20:24:03 +0000</pubDate>
				<category><![CDATA[spring boot]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=3262</guid>

					<description><![CDATA[<p>Swagger nos permite auto documentar nuestra API REST sin necesidad de programar nada, ya que aprovecha las anotaciones de Spring Boot</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/08/28/documentar-un-api-rest-con-swagger-y-spring-boot/">Documentar un API REST con Swagger y Spring Boot</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" width="852" height="477" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/swagger-banner.jpg" alt="" class="wp-image-3270" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/swagger-banner.jpg 852w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/swagger-banner-300x168.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/swagger-banner-768x430.jpg 768w" sizes="(max-width: 852px) 100vw, 852px" /></figure>



<p>La documentación de un API es casi tan importante como construirlos con buenas prácticas, pues su finalidad es que terceros la utilicen, por tal motivo, documentarla correctamente puede representar el éxito o fracaso en su implementación dentro de los sistemas de terceros:</p>



<span id="more-3262"></span>



<blockquote class="wp-block-quote"><p>Codigo fuente: Antes que nada, puedes descargar todo el código fuente en: <a href="https://github.com/codminddev/blog-spring-boot-swagger">https://github.com/codminddev/blog-spring-boot-swagger</a></p></blockquote>



<p>La documentación de un API es casi tan importante como construirlos con buenas prácticas, pues su finalidad es que terceros la utilicen, por tal motivo, documentarla correctamente puede representar el éxito o fracaso en su implementación dentro de los sistemas de terceros:</p>



<p>Por suerte, Spring Boot cuenta con la librería de Swagger que permite analizar todo el proyecto y auto documentar todos los servicios REST que encuentre de forma automática. De esta forma, nos ahorramos una gran cantidad de trabajo de documentación. Por ejemplo, veamos el siguiente servicio:</p>



<pre title="UserController.java" class="wp-block-code"><code lang="java" class="language-java line-numbers">@RestController
public class UserController {
	
	private List&lt;UserDTO> users = new ArrayList&lt;>();
	
	public UserController() {
		users.add(new UserDTO(1L, "admin"));
		users.add(new UserDTO(2L, "supervisor"));
		users.add(new UserDTO(3L, "cajero"));
	}

	@GetMapping(value = "users")
	public ResponseEntity&lt;List&lt;UserDTO>> findAll(){
		return ResponseEntity.ok(users); 
	}
	
	
	@PutMapping(value = "users")
	public ResponseEntity&lt;UserDTO> update(UserDTO request){
		UserDTO user = users.stream()
				.filter(currentUser -> currentUser.getId() == request.getId())
				.findFirst()
				.orElseThrow(() -> new RuntimeException("No existe el usuario"));
		user.setName(request.getName());
		return ResponseEntity.ok(user);
	}
	
	@PostMapping(value = "users")
	public ResponseEntity&lt;UserDTO> create(UserDTO request){
		users.add(request);
		return ResponseEntity.ok(request);
	}
	
	@DeleteMapping(value = "users/{userId}")
	public ResponseEntity&lt;?> delete( @PathVariable("userId") long userId ) {
		UserDTO user = users.stream()
		.filter(currentUser -> currentUser.getId() == userId)
		.findFirst()
		.orElseThrow(() -> new RuntimeException("No existe el usuario"));
		users.remove(user);
		return ResponseEntity.ok().build();
		
	}
}</code></pre>



<p>Podrá observar el clásico servicio CRUD de usuarios, donde tenemos un servicio para consultar todos los usuarios (GET), crear nuevos (POST), actualizarlos (PUT) y finalmente eliminarlos (DELETE).</p>



<p>Por suerte, Swagger es tan potente que puede aprovecharse del API de reflection para analizar la estructura de los métodos, sus anotaciones y los parámetros de entrada y salida para auto documentar el API, tal como se puede ver en la siguiente imagen:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="589" height="245" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image.png" alt="" class="wp-image-3263" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image.png 589w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-300x125.png 300w" sizes="(max-width: 589px) 100vw, 589px" /></figure>



<h2>Instalación</h2>



<p>Para lograr esto, es requerido solamente dos pasos, agregar las librerías de Swagger y crear un objeto de configuración llamado <code>Docket</code>, veamos cómo sería:</p>



<p>Lo primero es agregar las siguientes librerías en el archivo <code>pom.xml</code>:</p>



<pre title="pom.xml" class="wp-block-code"><code lang="xml" class="language-xml">&lt;dependency>
	&lt;groupId>io.springfox&lt;/groupId>
	&lt;artifactId>springfox-swagger2&lt;/artifactId>
	&lt;version>2.9.2&lt;/version>
&lt;/dependency>

&lt;dependency>
	&lt;groupId>io.springfox&lt;/groupId>
	&lt;artifactId>springfox-swagger-ui&lt;/artifactId>
	&lt;version>2.9.2&lt;/version>
&lt;/dependency></code></pre>



<p>La primera (<code>springfox-swagger2</code>) es la más importante, pues es que se encarga de analizar la estructura de nuestro proyecto y crear los metadatos para crear la auto documentación del API. La segunda (<code>springfox-swagger-ui</code>) es que se encarga de tomar los metadatos de la primera y crear una interfaz gráfica amigable con los usuarios.</p>



<h2>Configuración</h2>



<p>El segundo paso es crear el archivo <code>Docket</code>, mediante el cual le indicamos a Swagger que es lo que debe de tomar en cuanta al momento de crear la documentación. Para esto, debemos de crear una clase que este anotada con <code>@Configuration</code> y <code>@EnableSwagger2</code> y tenga un método que cree el objeto <code>Docket</code>:</p>



<pre title="SwaggerConfig.java" class="wp-block-code"><code lang="java" class="language-java line-numbers">@Configuration
@EnableSwagger2
public class SwaggerConfig {

	@Bean
	public Docket apiDocket() {
		return new Docket(DocumentationType.SWAGGER_2)
				.select()
				.apis(RequestHandlerSelectors.basePackage("com.codmind.swaggerapi.controllers"))
				.paths(PathSelectors.any())
				.build()
				.apiInfo(getApiInfo())
				;
	}
	
	private ApiInfo getApiInfo() {
		return new ApiInfo(
				"Order Service API",
				"Order Service API Description",
				"1.0",
				"http://codmind.com/terms",
				new Contact("Codmind", "https://codmind.com", "apis@codmind.com"),
				"LICENSE",
				"LICENSE URL",
				Collections.emptyList()
				);
	}
}</code></pre>



<p>Dentro del método <code>apiDocket</code> construimos el objeto <code>Docket</code>, en el cual le indicamos que tome todos los servicios que se encuentre en el paquete <code>com.codmind.swaggerapi.controllers</code> y los auto documente por nosotros.</p>



<p>Finalmente, en el método <code>getApiInfo</code>, creamos el objeto <code>ApiInfo</code>, el cual define los datos de la propiedad del API, como su nombre, correo de contacto, licencia, etc.</p>



<h2>La ejecución</h2>



<p>Si todo salió bien y corremos la aplicación, veremos el siguiente log:</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="589" height="181" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-1.png" alt="" class="wp-image-3264" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-1.png 589w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-1-300x92.png 300w" sizes="(max-width: 589px) 100vw, 589px" /></figure>



<p>Podrás ver que nos ha generado un path llamado <em><strong>/v2/api-docs</strong></em>, por lo que si los accedemos en el navegador (<a href="http://localhost:8080/v2/api-docs">http://localhost:8080/v2/api-docs</a>) podremos ver los metadatos del API generado por la librería <code>springfox-swagger2</code>:</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="384" height="312" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-2.png" alt="" class="wp-image-3265" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-2.png 384w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-2-300x244.png 300w" sizes="(max-width: 384px) 100vw, 384px" /></figure>



<p>Sin embargo, esta documentación no es para nada intuitiva, y es por ello que hemos instalado la librería springfox-swagger-ui, la cual toma esta metadata y crea la URL: <a href="http://localhost:8080/swagger-ui.html">http://localhost:8080/swagger-ui.html</a>, la cual se ve así:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="589" height="489" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-3.png" alt="" class="wp-image-3266" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-3.png 589w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-3-300x249.png 300w" sizes="(max-width: 589px) 100vw, 589px" /></figure>



<p>En esta página podemos apreciar 3 secciones, la primera corresponde al objeto <code>ApiInfo</code>, que contiene nombre del API, licencia, datos de contacto, etc.</p>



<p>La segunda sección corresponde a los servicios, agrupados por controlador. En este caso, podemos apreciar el <code>UserController</code> (user-controller) con las 4 operaciones CRUD que hemos definido.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-large"><a href="https://codmind.com/courses/api-rest-con-spring-boot" target="_blank" rel="noopener noreferrer"><img loading="lazy" width="800" height="450" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg.jpg" alt="" class="wp-image-3146" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption>Si quieres aprender a crear un API REST profesional con Swagger, te invito a mi curso Mastering API REST, donde aprenderemos las mejores prácticas para crear un API REST.</figcaption></figure>



<div style="height:95px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Finalmente, tenemos la sección de Models (modelos), la cual describe todos los objetos que utilizamos como request/response.</p>



<h2>Probando el API</h2>



<p>Finalmente, si expandimos cualquier servicio, por ejemplo, el método create (POST) y presionamos el botón Try It Out, podremos probar el servicio allí mismo:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="589" height="200" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-4.png" alt="" class="wp-image-3267" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-4.png 589w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-4-300x102.png 300w" sizes="(max-width: 589px) 100vw, 589px" /></figure>



<p>Nos desplegará los campos esperados por el servicio y si damos click en la sección Model, podrás ver la estructura de la respuesta esperada.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="589" height="329" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-5.png" alt="" class="wp-image-3268" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-5.png 589w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/image-5-300x168.png 300w" sizes="(max-width: 589px) 100vw, 589px" /></figure>



<h2>Conclusiones</h2>



<p>Documentar solo este servicio, nos podría tomar varias horas, ya que es necesario documentar su nombre, los parámetros que recibe, los retorna y además, habría que describir cada unos de los objetos que recibe y responde, para que los consumidores tengan claridad de la estructura de cada uno de estos, pero como hemos podido comprobar, mediante Swagger nos evitamos todo este trabajo.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/08/28/documentar-un-api-rest-con-swagger-y-spring-boot/">Documentar un API REST con Swagger y Spring Boot</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2020/08/28/documentar-un-api-rest-con-swagger-y-spring-boot/feed/</wfw:commentRss>
			<slash:comments>27</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3262</post-id>	</item>
		<item>
		<title>Spring boot – Inyectar propiedades con @Value</title>
		<link>https://www.oscarblancarteblog.com/2020/08/13/spring-boot-inyectar-propiedades-con-value/</link>
					<comments>https://www.oscarblancarteblog.com/2020/08/13/spring-boot-inyectar-propiedades-con-value/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 13 Aug 2020 05:14:03 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[spring boot]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=3227</guid>

					<description><![CDATA[<p>La anotación @Value permite inyectar propiedades del archivo application.properties</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/08/13/spring-boot-inyectar-propiedades-con-value/">Spring boot – Inyectar propiedades con @Value</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img loading="lazy" width="925" height="518" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/inyección-de-propiedades-con-@value.jpg" alt="@Value de Spring boot" class="wp-image-3229" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/inyección-de-propiedades-con-@value.jpg 925w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/inyección-de-propiedades-con-@value-300x168.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/inyección-de-propiedades-con-@value-768x430.jpg 768w" sizes="(max-width: 925px) 100vw, 925px" /></figure>



<p>La configuración es una de las partes más importantes de cualquier aplicación, pues permite que se pueda configurar según el entorno de ejecución o el ambiente en el que se desplegará, por suerte Spring boot cuenta con el archivo <code>application.properties</code>, en el cual podemos guardar todos aquellos valores que pueden cambiar con el tiempo, lo que evita la mala práctica de crear código hardcode o código duro.</p>



<span id="more-3227"></span>



<p>Pero la pregunta es, como podemos acceder a estar propiedades desde una aplicación, pues bien, gracias a la inyección de dependencias que caracteriza a Spring Boot, es posible inyectar cualquier propiedad mediante la anotación <code>@Value</code>, tal como se puede ver a c continuación:</p>



<pre class="wp-block-code"><code lang="java" class="language-java line-numbers">@Configuration
public class ConverterConfig {
	@Value("${path.to.prop.name }")
	private String myProp;
}</code></pre>



<p>Y el archive <code>application.properties</code> quedaría de la siguiente forma:</p>



<pre class="wp-block-code"><code lang="properties" class="language-properties line-numbers">path.to.prop.name=my value</code></pre>



<p>Esto aplica exactamente igual cuando con un archivo <code>application.yml</code>:</p>



<pre class="wp-block-code"><code lang="yaml" class="language-yaml line-numbers">path:
 to:
  prop:
   name:my value</code></pre>



<p>Mediante esta técnica ya no necesitarás poner código duro nunca más.</p>



<figure class="wp-block-image"><a href="https://codmind.com/courses/api-rest-con-spring-boot"><img loading="lazy" width="800" height="450" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg.jpg" alt="" class="wp-image-3146" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption>¿Quieres aprender a crear un API REST completa con Spring boot? te invito a curso de Mastering API REST con Spring Boot.</figcaption></figure>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/08/13/spring-boot-inyectar-propiedades-con-value/">Spring boot – Inyectar propiedades con @Value</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2020/08/13/spring-boot-inyectar-propiedades-con-value/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3227</post-id>	</item>
		<item>
		<title>La importancia del Timeout</title>
		<link>https://www.oscarblancarteblog.com/2020/07/18/la-importancia-del-timeout/</link>
					<comments>https://www.oscarblancarteblog.com/2020/07/18/la-importancia-del-timeout/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Sat, 18 Jul 2020 04:29:46 +0000</pubDate>
				<category><![CDATA[EAI]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=3186</guid>

					<description><![CDATA[<p>El timeout se da cuando el servidor tarda más de lo esperado, lo que puede provocar que los sistemas fallen en cascada</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/07/18/la-importancia-del-timeout/">La importancia del Timeout</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img loading="lazy" width="1024" height="575" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/timeout-banner2-1024x575.png" alt="" class="wp-image-3195" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/timeout-banner2-1024x575.png 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/timeout-banner2-300x169.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/timeout-banner2-768x432.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/timeout-banner2.png 1267w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Seguramente todos nos hemos encontrado alguna vez con que la
petición a un servicio o un recurso de internet nos retorna con un Timeout, lo
que significa que el servidor ha tardado tanto en responder que, el navegador o
el cliente que estamos utilizando para consumir el recurso corta la
comunicación, lo cual es muy frustrante, sin embargo, el Timeout es una de las
estrategias más importantes para proteger la salud de nuestro servidor. </p>



<span id="more-3186"></span>



<h2>Problemática</h2>



<p>Seamos sinceros, casi todo nos hemos topado con un Timeout
al momento de consumir un servicio, y en lugar de controlar el error y hacer
algo en consecuencia para que todo nuestro servicio no falle, simplemente
aumentamos el Timeout. En algunos casos solamente le agregamos unos segundos
adicionales y en el peor de los casos dejamos el Timeout en indefinido, lo que
es una muy mala práctica.</p>



<p>Desafortunadamente, como programadores siempre buscamos la solución
más fácil y la que requiere un menor esfuerzo de nuestra parte, lo cual nos
lleva a establecer un Timeout indefinido, sin embargo, da igual si le pones 1
minuto o 10hrs, o indefinido, al final, si un servicio no responde a los pocos
segundo, lo mas seguro es que no lo haga nunca, lo que provoca que no solo no obtengamos
la respuesta del servidor, si no que ahora acarreamos un problema crítico a nuestra
aplicación, la cual analizaremos con el siguiente ejemplo.</p>



<p>Imagina que estas construyendo un servicio para autorizar
créditos. Este servicio debe de recibir como parte de la solicitud del crédito,
los datos del cliente que lo esta solicitando, y luego deberá de consumir un
servicio externo para validar el historial crediticio del cliente, según su
calificación, se le podrá ofrecer o declinar el préstamo:</p>



<figure class="wp-block-image"><img loading="lazy" width="1024" height="207" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/1-timeout-happy-path-1024x207.png" alt="Timeout " class="wp-image-3187" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/1-timeout-happy-path-1024x207.png 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/1-timeout-happy-path-300x61.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/1-timeout-happy-path-768x155.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/1-timeout-happy-path.png 1090w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>En este caso, nuestro servicio (CreditService) recibirá la
petición de la solicitud de crédito y luego llamará al servicio de consulta del
historial crediticio (CreditHistoryService), si todo sale bien, nuestro
servicio obtendrá la respuesta del servicio anterior y podrá determinar si
puede o no, ofrecerle el crédito a nuestro cliente.</p>



<p>Ahora bien, en una arquitectura distribuida donde tenemos
múltiples servicios distribuidos por la red, siempre existirá la posibilidad de
que uno de estos no esté disponible o simplemente nos arroje un Timeout, lo
cual rompe por completo nuestro flujo, pues al no tener respuesta del servicio
de historial crediticio, el error se propaga hasta al cliente, por lo que no
será posible dale una respuesta:</p>



<figure class="wp-block-image"><img loading="lazy" width="1024" height="320" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/2-timeout-timeout-1024x320.png" alt="Timeout error" class="wp-image-3188" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/2-timeout-timeout-1024x320.png 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/2-timeout-timeout-300x94.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/2-timeout-timeout-768x240.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/2-timeout-timeout.png 1124w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Cual es el problema aquí, que como no queremos batallar y
queremos reducir al máximo la posibilidad de error y garantizar el happy path, incrementamos
el Timeout del servicio, lo cual es correcto si se hace dentro de un periodo de
tiempo considerable, sin embargo, solomos abusar de esto y poner tiempo larguísimos
como de 1 minuto o indefinido, lo que provoca que nuestro servicio se comience
a saturar de peticiones entrantes y al no tener respuesta del servicio, nuestra
aplicación se comienza a saturar de hilos:</p>



<figure class="wp-block-image"><img loading="lazy" width="1024" height="539" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/3-timeout-threads-1024x539.png" alt="Timeout threads" class="wp-image-3189" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/3-timeout-threads-1024x539.png 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/3-timeout-threads-300x158.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/3-timeout-threads-768x404.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/3-timeout-threads.png 1172w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Podrás ver que ahora los hilos se comienzan a acumular en
nuestro servicio, ya que al no tener respuesta del servicio, no podemos concluir
con la ejecución, y tras un largo periodo de tiempo o hasta que el cliente
decida cortar la comunicación, veremos que todas las ejecuciones terminaran
fallando, y en el peor de los casos, nuestra aplicación podrá verse seriamente
afectada en los tiempos de respuesta por la gran cantidad de hilos vivos que
tiene y finalmente caerse.</p>



<h2>Solución</h2>



<p>Para evitar este problema, es importante aceptar que los
Timeout ocurren, y no solo eso, que pueden ocurrir mucho más de lo que nos
gustaría, y es por ello que, en lugar de tratar de ocultar el problema, es
mejor aprender a lidiar con ello, es por esto que, lo primero que debemos de
hacer cuando consumimos recursos externos, es siempre definir un tiempo de
espera máximo, de esta forma, somos nosotros los que cortamos la comunicación y
procedemos con un plan B.</p>



<figure class="wp-block-image"><img loading="lazy" width="1024" height="349" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/4-timeout-set-timeout-1024x349.png" alt="Timeout setTimeout" class="wp-image-3190" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/4-timeout-set-timeout-1024x349.png 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/4-timeout-set-timeout-300x102.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/4-timeout-set-timeout-768x262.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/4-timeout-set-timeout.png 1091w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>En esta nueva estrategia, siempre que lanzamos un request,
definimos el tiempo de espera que estamos dispuesta a tolerar y si este tiempo
de espera se excede, entonces cortamos la comunicación y hacemos algo en
consecuencia. Dado que no podemos aprobar o rechazar la solicitud de crédito en
ese momento, no podríamos darle una respuesta al cliente de inmediato, pero tampoco
tendría necesariamente terminar en un error, ya que en lugar de regresarle un
error, podríamos guarda la solicitud, decir al cliente al cliente que estamos
procesando su solitud y que más tarde le notificaremos el resultado de la autorización.</p>



<figure class="wp-block-image"><img loading="lazy" width="1024" height="481" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/5-timeout-handler-1024x481.png" alt="Timeout error handler" class="wp-image-3191" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/5-timeout-handler-1024x481.png 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/5-timeout-handler-300x141.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/5-timeout-handler-768x361.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/5-timeout-handler.png 1091w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Con esta nueva arquitectura no solo hemos quedado bien con nuestro cliente, si no que evitamos que los hilos de ejecución se acumulen en nuestro servidor, evitando que este degrade sus tiempos de respuesta o finalmente muera.</p>



<figure class="wp-block-image"><a href="https://reactiveprogramming.io/books/software-architecture/es"><img loading="lazy" width="1024" height="586" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-1024x586.jpg" alt="" class="wp-image-3053" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-1024x586.jpg 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-300x172.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-768x439.jpg 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book.jpg 1966w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption>¿Te gustaría aprender a crear aplicaciones robustas aplicando los mejores patrones arquitectónicos? te invito a que veas mi libro de arquitectura de software, el mejor libro en español</figcaption></figure>



<h2>Conclusiones</h2>



<p>Como programadores siempre queremos asumir que todos los
servicios responderán correctamente, y de esta forma lavarnos las manos
diciendo que si nuestro servicio falla, es por culpa de otros, sin embargo, nuestra
responsabilidad como buenos desarrolladores es hacer aplicaciones resilientes,
que puedan recuperarse ante un error y responder adecuadamente.</p>



<p>Como hemos analizado en este artículo, nunca hay que asumir
que todos puede salir mal, al contrario, siempre hay que ser desconfiados y plantearnos
que pasarían ante un error, en este caso, ante un Timeout.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/07/18/la-importancia-del-timeout/">La importancia del Timeout</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2020/07/18/la-importancia-del-timeout/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3186</post-id>	</item>
		<item>
		<title>Multi-Tenancy &#124; Principio de arquitectura de software</title>
		<link>https://www.oscarblancarteblog.com/2020/07/12/multi-tenancy-principio-de-arquitectura-de-software/</link>
					<comments>https://www.oscarblancarteblog.com/2020/07/12/multi-tenancy-principio-de-arquitectura-de-software/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Sun, 12 Jul 2020 05:12:54 +0000</pubDate>
				<category><![CDATA[EAI]]></category>
		<category><![CDATA[Patrones de Diseño]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=3171</guid>

					<description><![CDATA[<p>Multi-Tenancy es un principio de arquitectura de software donde una aplicación puede albergar a múltiples clientes, de esta forma, todos trabajan sobre la misma instancia de software que se ejecuta en el mismo servidor, con la única diferencia de que los datos que pueden ver cada cliente son diferentes</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/07/12/multi-tenancy-principio-de-arquitectura-de-software/">Multi-Tenancy | Principio de arquitectura de software</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img loading="lazy" width="912" height="513" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/banner.jpg" alt="" class="wp-image-3172" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/banner.jpg 912w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/banner-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/banner-768x432.jpg 768w" sizes="(max-width: 912px) 100vw, 912px" /></figure>



<p>La llegada de la nube ha cambiado para siempre la forma en que consumimos software, pasando de tener que instalar una aplicación en nuestro equipo, ha simplemente acceder a un sitio web para tener acceso a toda nuestra información, pero la pregunta clave aquí es, ¿cómo es que una aplicación que vive en la nube, puede albergar múltiples clientes y al mismo tiempo mantener separada la información? Bueno, para resolver esta pregunta tenemos el termino Multi-Tenancy.</p>



<span id="more-3171"></span>



<p><strong>Multi-Tenancy es un principio de arquitectura de software donde una aplicación puede albergar a múltiples clientes</strong>, de esta forma, todos trabajan sobre la misma instancia de software que se ejecuta en el mismo servidor, con la única diferencia de que los datos que pueden ver cada cliente son diferentes, logrando un efecto en el que la aplicación se pueden ver como si fuera construida exclusivamente para uno de ellos.</p>



<figure class="wp-block-image"><img loading="lazy" width="780" height="488" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy.png" alt="" class="wp-image-3173" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy.png 780w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-300x188.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-768x480.png 768w" sizes="(max-width: 780px) 100vw, 780px" /></figure>



<p>Para poner un ejemplo claro de Multi-Tenancy que todos podremos
comprender, hablemos de Gmail. Seguramente todos aquí tenemos una cuenta de
correo en esta aplicación, sin embargo, cuando entramos solo podemos ver
nuestros correos, a pesar de que seguramente existen millones de correos electrónicos
en toda la plataforma. De esta misma forma, podemos personalizar la forma en
que se visualiza la página, ya que podemos cambiar la forma en que organizamos
los correos, las carpetas, colores, logotipo (si es una cuenta empresarial),
etc. Sin embargo, cada una de estar personalizaciones solo podrán ser
observadas por el dueño de ese cliente y nada más.</p>



<p>Multi-Tenancy hace posible que existan muchas de las
aplicaciones que hoy conocemos como SaaS ( Software as a Service), en la cual
pagamos (o no) una renta mensual para utilizar, como puede ser el mismo Gmail,
Trello, Netflix, YouTube, Salesforce, Twitter, Facebook, etc. </p>



<p>La pregunta ahora es, como es que estas aplicaciones logran
separar la información de sus clientes. Para empezar, sería buen aterrizar el
termino Multi-Tenancy, que si lo traducimos al español sería algo así como “Multi
inquilino” o “Multi usuario”. &nbsp;Una aplicación
Multi-Tenancy la podemos comparar con un edificio de apartamentos, donde todos
los inquilinos viven en el mismo edificio, utilizan la infraestructura general
de este, como lo es, personal de seguridad, áreas comunes, &nbsp;elevadores, etc., sin embargo, y a pesar de que
viven en el mismo edificio, no viven en el mismo lugar, pues cada uno tiene su
propio apartamento, donde pueden guardar sus pertenencias de forma seguras, y
la única personas que puede acceder, sería su dueño(s).</p>



<p>Siguiendo esta misma analogía en una aplicación
Multi-Tenancy, el edificio completo sería la aplicación, y cada apartamento sería
su información. En este sentido, podrás observar que todos los usuarios hacen
uso de la misma aplicación, &nbsp;pero la
información permanece asilada entre los diferentes usuarios.</p>



<figure class="wp-block-image"><img loading="lazy" width="781" height="701" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-multy-data-source.png" alt="" class="wp-image-3174" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-multy-data-source.png 781w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-multy-data-source-300x269.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-multy-data-source-768x689.png 768w" sizes="(max-width: 781px) 100vw, 781px" /></figure>



<p>Creo que a nivel conceptual esto puede resultar fácil de
entender, sin embargo, implementarlo en una aplicación real no es tan simple, ya
que hay que tener mucho cuidado de aislar correctamente la información de los
diferentes usuarios, ya que de lo contrarios, estaríamos exponiendo información
privada a otros usuarios. </p>



<h2>Formas de implementar una aplicación Multi-Tenancy</h2>



<p>Básicamente existen tres formas de lograr que una aplicación
sean Multi-Tenancy, las cuales son las siguientes:</p>



<h3>DB y esquema compartidos
(Shared DB, Shared Schema)</h3>



<p>Este es la forma más simple de crear una aplicación
Multi-Tenancy, la cual consiste en compartir una misma base de datos y esquema
para todos los usuarios registrados:</p>



<figure class="wp-block-image"><img loading="lazy" width="779" height="700" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-single-database.png" alt="" class="wp-image-3175" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-single-database.png 779w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-single-database-300x270.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-single-database-768x690.png 768w" sizes="(max-width: 779px) 100vw, 779px" /></figure>



<p>Para lograr la separación de la información, se suele
segmentar la información por columnas en la DB, de esta forma, cada registro
indica a que Empresa o usuario pertenece y cada uno de los Query que lancemos a
la base de datos deberá de contemplar este campo dentro del WHERE, para evitar
que la información se mescle:</p>



<p>SELECT *
FROM ORDERS WHERE TENANT = ?</p>



<p>En este caso, el WHERE es la única forma de segmentar la información,
ya que en caso de omitir ese filtro, se podría mostrar información de todos los
demás clientes, o incluso, borrar datos que no son de ese cliente en particular.</p>



<p>Solo por poner un ejemplo, mi plataforma de cursos <a href="https://codmind.com/">Codmind</a> yo la he construido desde cero
utilizando esta estrategia, ya que en una sola base de datos tengo la información
de todos mis clientes, separando la información por el ID del usuario.</p>



<h4>Ventajas:</h4>



<ul><li><strong>Fácil de implementar</strong>: como lo mencioné al
inicio, este método es el más simple, pues con solo agregar filtrar los
registros mediante una columna, es posible segmentar la información.</li><li><strong>Cero configuraciones</strong>: Cada que un nuevo cliente
se registra, solo hace falta registrarlo en la DB y comenzar a segmentar su
información según su TenantID.</li><li><strong>Fácil de mantener</strong>: Dado que solo tenemos
una DB, es muy simple darle mantenimiento y respaldar la información.</li></ul>



<h4>Desventajas:</h4>



<ul><li><strong>Aislamiento</strong>: Dado que toda la información
está en la misma base de datos, es mas propenso a que mesclemos información de
los clientes.</li><li><strong>Seguridad</strong>: Si el acceso a los datos se ve
comprometida, el atacante tiene acceso a la información de todos los clientes. Por
otra parte, cuando le damos acceso a un programador a la DB, automáticamente
tiene acceso a la información de todos los clientes, aun cuando solo quiera
analizar un problema con un cliente determinado.</li><li><strong>Escalamiento</strong>: Dado que toda la información
vive en una sola DB, es escalamiento se ve limitado hasta el número de
transacciones que un solo manejador de base de datos pueda soportar.</li><li><strong>Disponibilidad</strong>: La disponibilidad entera
de la aplicación depende de una sola base de datos, por lo que si se cea, todo
el sistema se muere.</li></ul>



<h3>DB compartida, diferente
Schema</h3>



<p>Este método es muy similar al anterior, ya que los clientes
comparten la base de datos, con la única diferencia de que la información se almacena
en schemas diferentes:</p>



<figure class="wp-block-image"><img loading="lazy" width="781" height="764" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-single-database-multiple-schema.png" alt="" class="wp-image-3176" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-single-database-multiple-schema.png 781w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-single-database-multiple-schema-300x293.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-single-database-multiple-schema-768x751.png 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-single-database-multiple-schema-60x60.png 60w" sizes="(max-width: 781px) 100vw, 781px" /></figure>



<p>Esta técnica permite un mejor
aislamiento de la información, pues cada schema tiene un usuario diferente y
cada uno de estos tiene una replica de las tablas, por lo que ya no es
necesario segmentar la información mediante el WHERE del query, en su lugar, el
reto consiste en conectarnos al Schema correcto según el cliente que está
realizando la solicitud.</p>



<h4>Ventajas:</h4>



<ul><li><strong>Mejor Aislamiento</strong>: Esta técnica tiene un
mejor aislamiento que la estrategia anterior, pues cada cliente tendrá su
propio schema, sin embargo, aun tenemos el problema de que con un usuario administrado
de la DB es posible acceder a todos los Schemas.</li><li><strong>Optimización de la infraestructura</strong>: Dado
que varios clientes pueden utilizar la misma base de datos, es posible
compartir los recursos del servidor, de esta forma, si un cliente tiene poca
demanda, deja los recursos para los clientes que consumen mas recursos, de esta
forma evitamos tener recursos no utilizados y que estemos pagando.</li><li><strong>Escalamiento: </strong>Dado que las conexiones son
por schema, esto permite tener múltiples bases de datos con múltiples schemas,
por lo que podemos crear más servidores de base de datos a medida que el número
de clientes aumenta.</li></ul>



<h4>Desventajas:</h4>



<ul><li><strong>Mantenimiento</strong>: Al tener múltiples schemas,
es necesario crear mecanismos que creen los schemas de forma automática cuando
un nuevo cliente se registre, además de que hay que darles soporte de forma separada.</li><li><strong>Respaldo</strong>: El respaldo de vuele una tarea un
poco más complicada, porque ahora hay que gestionar un respaldo por cada schema.</li><li><strong>Configuración</strong>: Debemos preparar al
sistema para conectarse dinámicamente a diferentes fuentes de datos, lo que
puede representar un reto de ingeniería del lado del servidor.</li></ul>



<h3>Una base de datos por Inquilino (Database per Tenant)</h3>



<p>Esta técnica consiste en que cada cliente utiliza una base
de datos totalmente separada, lo que implica que tengamos una base de datos por
cliente</p>



<figure class="wp-block-image"><img loading="lazy" width="800" height="701" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-multy-database.png" alt="" class="wp-image-3177" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-multy-database.png 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-multy-database-300x263.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/multi-tenancy-multy-database-768x673.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>Esta es la estrategia que permite el mayor nivel de aislamiento
y seguridad, pues separar por completo la información de cada usuario en su
propia base de datos, pero también implica el mayor esfuerzo en configuración,
pues se tendrá que crear una nueva base de datos por cada cliente que se
registre. Además, cada servidor de base de datos consume recurso del lado del
servidor, los cuales estarán reservados, los utilice o no.</p>



<h4>&nbsp;Ventajas:</h4>



<ul><li><strong>Seguridad</strong>: Dado que cada base de datos es
independiente, proporciona el mejor nivel de seguridad, pues de comprometerse una
base de datos, solo afectará a un cliente y no a todos.</li><li><strong>Aislamiento</strong>: relacionado con el anterior,
cada base de datos contiene la información de un solo cliente, lo que hacer muy
difícil mesclar información entre clientes.</li><li><strong>Escalamiento</strong>: Dado que cada cliente
utiliza su propia base de datos, es posible escalar los recursos de cada
cliente a medida que estos crecen. Además, la carga de la base de datos no se
comparte entre clientes, pues cada uno tiene su propia base de datos.</li><li><strong>Disponibilidad</strong>: Dado que cada cliente tiene
su propia base de datos, si alguna se cae, no afecta al resto de clientes.</li></ul>



<p>Desventajas:</p>



<ul><li><strong>Mantenimiento</strong>: Las múltiples instancias de las bases de datos hace más complicado el mantenimiento, pues se tendrá que cuidar N servidor de base de datos.</li><li><strong>Respaldo</strong>: Hacer respaldos se hace una tarea complicada, pues habrá que configurar proceso que se conecten a múltiples servidores para hacer los respaldos.</li><li><strong>Configuración</strong>: En esta arquitectura no basta con clonar los schemas, si no que es necesario levantar dinámicamente más servidores que alberguen las nuevas bases de datos.</li><li><strong>Costo</strong>: Dado que es necesario tener bases de datos separadas, también será necesario contar con servidores de base datos separados, lo que puede incrementar los costos operativos.</li></ul>



<figure class="wp-block-image"><a href="https://reactiveprogramming.io/books/software-architecture/es"><img loading="lazy" width="1024" height="586" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-1024x586.jpg" alt="" class="wp-image-3053" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-1024x586.jpg 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-300x172.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-768x439.jpg 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book.jpg 1966w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption>¿Quieres aprender más principios de diseño y patrones arquitectónicos como este que acabas de ver y convertirte en arquitecto de software? Te invito a que veas mi libro de Arquitectura de software, el mejor libro en español.</figcaption></figure>



<h2>Conclusiones</h2>



<p>Las aplicaciones Multi-Tenancy llegaron para quedarse,
incluso, creo que en un futuro, todas las aplicaciones que utilizaremos serán
bajo este principio, ya que nos permite accederlas desde cualquier lugar y
cualquier equipo, algo muy diferente a las aplicaciones a las aplicaciones
convencionales, donde tenemos que estar en la computadora donde instalamos el
software o de lo contrario no tenemos acceso ni al software, ni a la información.
Otra de las ventajas que ofrece es que no requiere configuración e incluso,
muchas de las veces son gratuitas, o al menos hasta cierto tiempo o uso.</p>



<p>Creo que hoy en día, todos los productos de software que creemos,
deberán estar enfocados al Multi-Tenancy, ya que nos permite llegar a más
clientes, además que el modelo por suscripción ha demostrado ser más rentable
que el pagar una cuota fina por licencia (sin contar que evitamos la piratería).</p>



<p><strong>NOTA</strong>: Estoy pensando en escribir un artículo de como
implementar un sistema Multi-Tenancy usando Spring Boot, así que si te interesaría
que lo escribiera, me gustaría que me lo comentaras, así puede que me anime a
crearlo.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/07/12/multi-tenancy-principio-de-arquitectura-de-software/">Multi-Tenancy | Principio de arquitectura de software</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2020/07/12/multi-tenancy-principio-de-arquitectura-de-software/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3171</post-id>	</item>
		<item>
		<title>El principio CQS (Command Query Separation)</title>
		<link>https://www.oscarblancarteblog.com/2020/07/11/el-principio-cqs-command-query-separation/</link>
					<comments>https://www.oscarblancarteblog.com/2020/07/11/el-principio-cqs-command-query-separation/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Sat, 11 Jul 2020 05:51:10 +0000</pubDate>
				<category><![CDATA[EAI]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=3163</guid>

					<description><![CDATA[<p>El principio CQS nos dice que debe de a ver dos tipos de métodos, lo que solo consultan el estado y los que solo lo actualizan, pero sin retorna datos</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/07/11/el-principio-cqs-command-query-separation/">El principio CQS (Command Query Separation)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img loading="lazy" width="951" height="535" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/CQS.jpg" alt="" class="wp-image-3168" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/CQS.jpg 951w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/CQS-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/07/CQS-768x432.jpg 768w" sizes="(max-width: 951px) 100vw, 951px" /></figure>



<p>Hoy les quiero hablar de estos principios que como arquitectos de software nos encantan, pues nos permite expandir mas nuestro vocabulario y aprender de pasada algunas nuevas técnicas, en este caso, les quiero hablar del principio <strong>Command Query Separation</strong> (CQS), que en español sería algo así como “<em>Separación de consulta y comando</em>”, aunque en lo particular me gusta utilizar el término en inglés,  pues en español suena espantoso.</p>



<span id="more-3163"></span>



<p>Pero bueno, basta de tonterías y pasemos a lo realmente interesante. Este principio fue acuñado por <strong>Bertand Meyer</strong> en su libro “<em>Object Oriented Software Construction</em>”.  Este principio dice básicamente que, <strong>deberíamos de separar los métodos de una clase en dos categorías</strong>, una de consultas (<em>query</em>) y otra de comandos (<em>command</em>).</p>



<ul><li><strong>Query</strong>: son aquellos métodos que consulta
información pero no modifican el estado de la aplicación.</li><li><strong>Command</strong>: son los métodos que actualizan
el estado de la aplicación pero no retornan un valor.</li></ul>



<p>Básicamente, <strong>este principio nos ayuda a construir software más mantenible y testeable</strong>, pues deja muy en claro que los métodos de consulta (query) solo consultará el estado de la aplicación, y por ningún motivo lo cambiarán, lo que permite utilizar todos estos métodos con toda seguridad y sin la preocupación de que estos actualizarán el estado. Pero por otra parte,  los métodos de comando (<em>command</em>) solo actualizarán el estado de la aplicación.</p>



<p>Para comprender este principio, podríamos comprar este principio con los métodos get y set de una clase:</p>



<pre class="wp-block-code"><code lang="java" class="language-java">public class Product {
	private Long id;
	private String name;
	
	public Long getId(){
		return id;
	}
	
	public void setId(Long id){
		this.id = id;
	}
	
	public String getName(){
		return name;
	}
	
	public void setName(String name){
		this.name = name;
	}
}
</code></pre>



<p>Podrás observar claramente que los métodos <code>get</code> y <code>set</code> solo sirven para consultar el estado de la clase pero sin actualizarlo, ahora bien, si nos vamos a los métodos <code>set</code>, podrás ver que su único objetivo es actualizar el estado, pero no retornan ningún valor (<em>void</em>).</p>



<p>A pesar de que este principio es relativamente fácil de comprender, no pasa lo mismo a la hora de llevarlo a la práctica, pues en muchas ocasiones es necesario crear método que actualicen el estado y retornen un valor, por ejemplo, un servicio que guardar un Producto en la base de datos y nos regrese el ID generado:</p>



<pre class="wp-block-code"><code lang="java" class="language-java">public Long save(Product product) {
	Long id = dao.persist(product);
	return id;
}</code></pre>



<p>Y bueno, se que estarás pensando, quizás se pueda hacer de
otra forma, ¿pero te has puesto a pensar como es posible recuperar el ID generado
si no lo hace justo en el momento de la inserción?</p>



<p>Ahora bien, esto no ocurre solo con un servicio que inserta en la base de datos, existen cientos de casos muy similares donde este principio no se cumple, un ejemplo de esto es el legendario método <code>pop</code> de una pila, el cual saca el primer elemento y lo retorna, o que tal el método <code>next</code> de un iterador en Java, el cual retorna el siguiente elemento de una colección pero incrementa el apuntador al siguiente elemento, o que pasa por ejemplo con servicios auditables, donde tenemos que guardar un registro para saber cada vez que un usuario intento leer un recursos, algo muy similar a cuando un usuario se intenta autenticar sin éxito en varias ocasiones, lo que daría como resultado el bloque del usuario, pero entonces, si el login es solo una consulta, ¿cómo podríamos actualizar el contado de logins falidos? </p>



<p>Dicho lo anterior, no quiero parecer fatalista y decir que este principio no sirve, al contrario, creo que es un excelente principio que deberíamos de utilizar donde sea posible, y quiero hace un especial énfasis en la palabra “<em>posible</em>”, pues este principio no es la panacea, ya que como hemos expuesto en este artículo, no siempre podrá ser posible cumplirlo y eso está bien, pero habrá otros casos donde sí.</p>



<p>A modo personal, me gustaría pensar que este principio nos deja una enseñanza, la cual yo interpreto de la siguiente forma, “<em>busquemos en la medida de los posible separar los método que consultan de los que actualizan, de tal forma que los consumidor sepan con certeza que un método solo consultará el estado y los otros solo para actualizarlo</em>”, como nota final, yo dejaría como opcional que un método de comando (<em>command</em>) no retorne datos, ya que en la práctica vemos que es muy normal que este tipo de método retorna algún resultado.</p>



<p>Finalmente, yo agregaría que los nombres de los métodos deberían de cumplir cierta nomenclatura que deje muy claro la intención del método, ya que al igual que tenemos los métodos<code>get</code> y <code>set</code>, podríamos utilizar prefijos claros como:</p>



<p>Para actualizar</p>



<ul><li>set</li><li>delete</li><li>update</li><li>create</li><li>save</li><li>remove</li><li>change</li></ul>



<p>Lo que nos darían nombres para métodos como: <code>setName</code>, <code>updateOrder</code>, <code>deleteEmployee</code>, <code>removeUser</code>, <code>createCustomer</code>, etc.</p>



<p>Para consultar:</p>



<ul><li>get</li><li>find</li><li>retrieve</li><li>query</li><li>search</li><li>is</li></ul>



<p>Estos nos darían nombres de método como: <code>getName</code>, <code>findOrder</code>, <code>retrievePayment</code>, <code>queryUser</code>, <code>searchProduct</code>, <code>isActive</code>, etc.</p>



<figure class="wp-block-image"><a href="https://reactiveprogramming.io/books/software-architecture/es"><img loading="lazy" width="1024" height="586" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-1024x586.jpg" alt="" class="wp-image-3053" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-1024x586.jpg 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-300x172.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-768x439.jpg 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book.jpg 1966w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption>👆👆👆 ¿Te gustaría aprender más principios de diseño como este y convertirte en arquitecto de software? te invito a que veas mi libro de Introducción a la arquitectura de software, el mejor libro de arquitectura en Español.</figcaption></figure>



<h2>Conclusiones</h2>



<p>Como siempre, me gusta dar una conclusión de lo que pienso,
aun que debe de quedar claro que es una apreciación personal, por lo que tu
podrías pensar diferente y eso está bien, ya que es parte del debate que
podríamos tener.</p>



<p>Pues bien, lo que yo pienso es que este es un patrón que nos
invita a separar claramente los método en dos categorías, lo cual está super
bien por que hace el código más entendible, mantenible y testeable, sin embargo,
yo veo que es un principio que romperemos más de lo que nos gustaría, lo que nos
puede hacer creer que estamos creando código con malas prácticas, sin embargo, y
como hemos demostrado en este artículo, en la práctica es difícil lograr en
muchos casos cumplir al pie de la letra este principio, por lo que me mi recomendación
es, trata de cumplirlo cuando puedas, pero no dudes en romperlo cuando sea
necesario.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/07/11/el-principio-cqs-command-query-separation/">El principio CQS (Command Query Separation)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2020/07/11/el-principio-cqs-command-query-separation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3163</post-id>	</item>
		<item>
		<title>Hoisting – Un concepto desconocido de JavaScript</title>
		<link>https://www.oscarblancarteblog.com/2020/06/09/hoisting-un-concepto-desconocido-de-javascript/</link>
					<comments>https://www.oscarblancarteblog.com/2020/06/09/hoisting-un-concepto-desconocido-de-javascript/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 09 Jun 2020 23:22:54 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=3060</guid>

					<description><![CDATA[<p>Hoisting es un concepto que dice que las variables y funcionnes son elevadas al comienzo del contexto que las contiene</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/06/09/hoisting-un-concepto-desconocido-de-javascript/">Hoisting – Un concepto desconocido de JavaScript</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img loading="lazy" width="964" height="540" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-banner.png" alt="" class="wp-image-3065" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-banner.png 964w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-banner-300x168.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-banner-768x430.png 768w" sizes="(max-width: 964px) 100vw, 964px" /></figure>



<p>JavaScript es sin duda uno de los lenguajes más extraños en cuanto a su comportamiento, pues para muchos, se puede comportar de una forma impredecible, y uno de estos casos es algo llamado Hoisting, el cual es concepto para referirse a cómo funcionan el contexto de ejecución de JavaScript.</p>



<span id="more-3060"></span>



<p>Si buscamos por Internet una definición de lo que es Hoisting,
veremos que dice algo así como: “Las declaraciones de variables y funciones son
enviadas físicamente al inicio del código”, sin embargo, esto no es del todo
cierto, ya que si bien, si son enviadas al inicio del código, esto solo se hace
en memoria, cuando JavaScript esta siendo interpretado por el navegador, sin
embargo, los método y variables permanecen físicamente en el mismo lugar en
donde fueron declaradas.</p>



<figure class="wp-block-image"><img loading="lazy" width="920" height="299" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-vars.png" alt="Hoisting var functions" class="wp-image-3061" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-vars.png 920w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-vars-300x98.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-vars-768x250.png 768w" sizes="(max-width: 920px) 100vw, 920px" /></figure>



<p>Básicamente la imagen anterior ilustra el concepto de Hoisting, pero la pregunta es, con qué intención JavaScript hace esto y por que no simplemente deja el código tal y como esta, bueno, la respuesta es simple, cuando JavaScript se ejecuta, carga todo el código en memoria para ejecutarlo, sin embargo, existe la limitante de que un método o variable no estará disponible si esta no ha sido definida antes de que sea utilizada, por tal motivo, si el Runtime de JavaScript ejecutara el código tal y como se ve del lado izquierdo, provocaría que el método <code>helloworld</code> no esté definido al momento de mandarlo a llamar, ya que la invocación se está haciendo antes de que la función fuera declarada, por este motivo, el Runtime coloca las variables y métodos al inicio, de esta forma, veremos algo como lo que vemos del lado derecho, donde el método es colocado al inicio del código y cuando se realice la llamada a la función, está ya estará definida.</p>



<p>Algo a tomar en cuenta es que tanto las variables como las
funciones no se envían arbitrariamente al comienzo del código, sino que se envían
al comienzo del contexto que las contiene, por ejemplo, una variable definida dentro
de una función, será enviada al comienzo de la función, no de todo el código. </p>



<figure class="wp-block-image"><img loading="lazy" width="927" height="385" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-output.png" alt="Hoisting output" class="wp-image-3062" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-output.png 927w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-output-300x125.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-output-768x319.png 768w" sizes="(max-width: 927px) 100vw, 927px" /></figure>



<p>El ejemplo anterior es también un poco confuso, pues si observamos, tenemos dos variables llamadas <code>a</code>, una a nivel del archivo y otra a nivel del método, luego, cuando ejecutamos el método <code>print</code>, imprimimos la variable a, la cual se imprime como <code>undefined</code>, pero luego, declaramos la variable <code>a = 20</code>, e imprimimos nuevamente la variable, lo que ahora si nos arroja el valor <code>20</code>.</p>



<p>¿Pero que diablos está pasando aquí?, pues bien, el Hoisting
está haciendo nuevamente de las suyas, pues lo que en realidad está pasando es
lo siguiente:</p>



<figure class="wp-block-image"><img loading="lazy" width="957" height="436" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-context.png" alt="Hoisting context" class="wp-image-3063" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-context.png 957w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-context-300x137.png 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/hoisting-context-768x350.png 768w" sizes="(max-width: 957px) 100vw, 957px" /></figure>



<p>Observa como la variable <code>a</code> que está dentro de la función, en realidad está siendo llevada al comienzo de la función, pues la función es el contexto directo de la variable. Un dato importante a tomar en cuenta es que la asignación de la variable no se eleva al comienzo de la función, sino únicamente su declaración. Debido a esta elevación, a ya está disponible al momento de la primera impresión en pantalla, aun que su valor es <code>undefined</code> por que no se le ha asignado ningún valor. Es cuando a es igualada a <code>20</code>, cuando la segunda impresión ya muestra el valor de <code>20</code>.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/06/09/hoisting-un-concepto-desconocido-de-javascript/">Hoisting – Un concepto desconocido de JavaScript</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2020/06/09/hoisting-un-concepto-desconocido-de-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3060</post-id>	</item>
		<item>
		<title>Throttling pattern</title>
		<link>https://www.oscarblancarteblog.com/2020/06/07/throttling-pattern-2/</link>
					<comments>https://www.oscarblancarteblog.com/2020/06/07/throttling-pattern-2/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Sun, 07 Jun 2020 22:30:15 +0000</pubDate>
				<category><![CDATA[EAI]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=3051</guid>

					<description><![CDATA[<p>El patrón Throttling permite controlar la cantidad de recursos que una aplicación puede utilizar antes de estrangular los procesos no esenciales a favor de mantener a flote el barco</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/06/07/throttling-pattern-2/">Throttling pattern</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img loading="lazy" width="973" height="545" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/throttling-pattern.jpg" alt="" class="wp-image-3057" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/throttling-pattern.jpg 973w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/throttling-pattern-300x168.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/throttling-pattern-768x430.jpg 768w" sizes="(max-width: 973px) 100vw, 973px" /></figure>



<p>El patrón Throttling permite controlar la cantidad de recursos que una aplicación puede utilizar antes de estrangular los procesos no esenciales a favor de mantener a flote el barco, evitando una interrupción del servicio o el incumplimiento de los SLA.</p>



<span id="more-3051"></span>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Problemática</h2>



<p>Hoy en día es bastante común encontrarnos en situaciones donde nuestra aplicación recibe una carga inusual de trabajo, que pone en peligro el funcionamiento de la aplicación, a tal punto que puede ralentizar los tiempos de respuesta, abortar operaciones o finalmente, terminar tumbando la aplicación por completo.</p>



<p>Si bien, este tipo de problemas son fácilmente manejables con estrategias de autoescalado, tiene la limitante de que esto no es inmediato, si no que requiere breve periodo de tiempo para aprovisionar más instancias de un servicio determinado, lo que podrías dar lugar a una breve interrupción del servicio.</p>



<p>Puedes aprender más de escalamiento en mi artículo donde explico que es el <a href="https://www.oscarblancarteblog.com/2017/03/07/escalabilidad-horizontal-y-vertical/">escalamiento horizontal y vertical</a>.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Solución</h2>



<p>La solución que propone el patrón Throttling es permitir que la aplicación utilice recursos hasta cierto límite, y luego limitar (en realidad es estrangular, pero se escucha muy extraño) el funcionamiento de la aplicación para evitar comprometer los tiempos de respuesta o el funcionamiento total de la aplicación.</p>



<p>El termino estrangular (Throttling) puede resultar un poco confuso, pero se refiere a la capacidad de una aplicación o servicio priorizar el funcionamiento vital de la aplicación, y limitando o denegando el servicio a todos aquellos menos importantes.</p>



<p>Dicho lo anterior, existen varias formas en las que podemos limitar el uso de recursos de una aplicación, entre las que destacan:</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h3>1 &#8211; Limitar el número de peticiones</h3>



<p>Una de las estrategias más ampliamente utilizada es el estrangulamiento por número de peticiones, que consiste en limitar el número de peticiones que un cliente puede realizar al servicio en un tiempo determinado, lo que obliga a la aplicación a medir el numero de solicitudes por cliente, y finalmente denegar el servicio cuando el umbral ha sido alcanzado.</p>



<p>Este enfoque es especialmente útil cuando ofrecemos un API a nuestros clientes, los cuales pueden utilizar a demanda cualquier servicio que proporcionemos, sin embargo, como no tenemos el control de cuantas llamadas realicen, es importante blindas nuestra API para que no hagan un uso irresponsable de los servicios que les proporcionamos y terminen degradando o tumbando el API.</p>



<p>Por ejemplo, hay casos donde un cliente utiliza técnicas irresponsables como el Pooling para consultar con demasiada frecuencia cierta información, lo que puede implicar el uso de una gran cantidad de recursos del servidor para atender cada petición.</p>



<figure class="wp-block-image"><img loading="lazy" width="659" height="353" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/pooling.png" alt="" class="wp-image-3052" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/pooling.png 659w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/pooling-300x161.png 300w" sizes="(max-width: 659px) 100vw, 659px" /><figcaption>Pooling pattern</figcaption></figure>



<p>Puedes leer más del patrón Pooling en el siguiente artículo de mi <a href="https://reactiveprogramming.io/books/software-architecture/es">libro de arquitectura de software</a>.</p>



<p>Pero el uso excesivo de los recursos del servidor no solo se puede dar por un uso irresponsable, si no que se puede dar el caso de que nuestro cliente presente un crecimiento natural en su operación, lo que implica un mayor número de peticiones al API, lo que implicaría un uso mayor al negociado al comienzo. </p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h4>Throttling con Nginx</h4>



<p>Una de las formas más simples de implementar el patrón Throttling por número de peticiones es utilizar Nginx, un proxy web que permite limitar el número de peticiones por medio de configuración:</p>



<pre class="wp-block-code"><code class="">limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
 
server {
    location /login/ {
        limit_req zone=mylimit;
        
        proxy_pass http://my_upstream;
    }
}</code></pre>



<p>El ejemplo muestra como limitar las llamadas al servicio de login (/login/) con una taza de 10 request por segundo (rate=10r/s).</p>



<p>Puedes ver el ejemplo completo en la documentación de Nginx (<a href="https://www.nginx.com/blog/rate-limiting-nginx/">https://www.nginx.com/blog/rate-limiting-nginx/</a>)</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h3>2 &#8211; Priorizar servicios esenciales</h3>



<p>Otra de las estrategias más utilizadas para implementar el Throttling es limitar o denegar los servicios no esenciales, de esta forma, podemos simplemente denegar el servicio a ciertas operaciones hasta que el sistema se ve restablecido o utilizar una estrategia menos agresiva como degradar la calidad del servicio para permitir liberar recursos para que los procesos esenciales puedan seguir funcionando.</p>



<p>Para implementar esta estrategia es importante poder
identificar cuales son los procesos vitales y cuales son prescindibles, de tal
forma que podamos apagarlos o degradarlos de forma rápida, evitando que el
sistema llegue a un estado de saturación.</p>



<p>Un ejemplo bastante contundente de esta estrategia es la que utilizo Netflix durante la pandemia del COVID-19, en el ancho de banda de Europa se saturó por la masiva cantidad de gente que se quedaba en casa y solo podría ver TV, lo que obligó a Netflix a degradar la calidad del servicio a HD en lugar de ofrecer 4K o Full HD.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h3>3 – Distribución prioritarias de solicitudes</h3>



<p>Esta estrategia se utiliza mucho en sistema multitenant,
donde varios inquilinos utilizan la misma aplicación, sin embargo, se les
ofrece un SLA diferente según el nivel de cada cliente. Mediante esta
estrategia es posible priorizar los mensajes mediante de colas de mensaje de
prioridad y atender estos mensajes según su prioridad, de esta forma damos
prioridad a nuestros clientes premium y dejamos en espera o denegamos el
servicio al resto de clientes.</p>



<p>Esta estrategia es muy utiliza por ejemplo en aplicaciones en la nube donde tenemos clientes gratuitos y clientes premium, lo que nos permite garantizar una experiencia constante a los clientes premium y a los clientes gratuitos los dejamos en espera hasta que el sistema se regulariza. Ya que al final, lo más importante es mantener contentos a los clientes que si esta pagando por el servicio.</p>



<figure class="wp-block-image"><a href="https://reactiveprogramming.io/books/software-architecture/es" target="_blank" rel="noreferrer noopener"><img loading="lazy" width="1024" height="586" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-1024x586.jpg" alt="" class="wp-image-3053" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-1024x586.jpg 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-300x172.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book-768x439.jpg 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/book.jpg 1966w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption>¿Quieres aprender más patrones arquitectónicos como este y convertirte en arquitecto de software? te invito a que veas mi libro de arquitectura de software<br></figcaption></figure>



<h2>Consideraciones</h2>



<p>A pesar de que Throttling es un excelente patrón, no todo es
felicidad, pues hay ciertas cosas que debemos de considerar antes de
implementarlo, y que son clave para su éxito.</p>



<ul><li>Lo primero es más importante, la aplicación debe de a ver sido diseñada desde el comienzo para soportar esta capacidad, pues es necesarios desde el inicio, determinar los servicios vitales y de los que podemos preceder por un breve periodo de tiempo.</li><li>Este patrón debe de actuar rápido, ya que ante un pico de demanda, si el patrón no estrangula rápidamente el servicio, puede que el servicio se degrade por un breve periodo de tiempo o incluso, se caiga antes de que el estrangulamiento entre.</li><li>Es importante distinguir entre un error de la aplicación y uno de estrangulamiento, ya que de esta forma el cliente podrá saber el motivo por el cual su invocación está siendo rechazada.</li><li>El estrangulamiento de puede utilizar como una estrategia temporal en lo que el autoescalado se lleva a cabo.</li><li>Finalmente y no menos importante, el sistema deberá de tener la capacidad de regresar a su estado una vez que la carga de trabajo se ha normalizado, de lo contrario quedarán los servicios estrangulados por tiempo indeterminado.</li><li>El estrangulamiento debe de ser un proceso automático y no manual, lo que quiere decir que este debe de entrar de forma automática por ciertas reglas determinadas y no por un operador que active y desactive componentes.</li></ul>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Cuando deberíamos de usar Throttling</h2>



<ul><li>Cuando necesitamos garantizar el cumplimiento de los SLA a pesar de los picos altos de demanda.</li><li>Evitar que un solo cliente monopolice los recursos del servidor.</li><li>Para permitir la operatividad del servicio a pesar de un pico de demanda no esperado.</li><li>En ciertas ocasiones nos pueden servir como una válvula para impedir que ciertas aplicaciones consuman más recursos de los esperados, sobre pasando un límite de facturación, muy parecido a lo que hacen lo que hace AWS o Azure en sus servicios en la nube.</li></ul>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Conclusiones</h2>



<p>Throlling es uno de los patrones más utilizados para servicios
que son habilitados para ser utilizados por terceros, donde no tenemos el
control sobre la cantidad o demanda que puedan necesitar, logrando protegernos
de picos de demanda no esperados o que sobre pasan un umbral esperado.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2020/06/07/throttling-pattern-2/">Throttling pattern</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2020/06/07/throttling-pattern-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3051</post-id>	</item>
	</channel>
</rss>
