{"id":1643,"date":"2024-02-01T15:52:04","date_gmt":"2024-02-01T14:52:04","guid":{"rendered":"https:\/\/intsight.com\/?p=1643"},"modified":"2024-02-01T15:52:04","modified_gmt":"2024-02-01T14:52:04","slug":"la-mentalidad-predominante","status":"publish","type":"post","link":"https:\/\/intsight.com\/index.php\/2024\/02\/01\/la-mentalidad-predominante\/","title":{"rendered":"La mentalidad predominante"},"content":{"rendered":"<p><span style=\"font-variant: small-caps; font-size: 107%\">Intentar\u00e9 ser<\/span> breve.<\/p>\n<p>Hace ya m\u00e1s de diez a\u00f1os, a una persona muy inteligente y a m\u00ed nos pusieron a trabajar a destajo en dos proyectos paralelos en Java cuyo n\u00facleo t\u00e9cnico era bastante parecido: hab\u00eda que enviar precios en una red local a toda leche. Por entonces, Java iba s\u00f3lo por la versi\u00f3n 7, y hab\u00eda una estructura de datos en Java que se hab\u00eda puesto de moda: el \u00abpatr\u00f3n Disruptor\u00bb. No pongo enlaces porque no se lo merece. La idea del famoso disruptor era sustituir la t\u00edpica cola bloqueante (o el <em>Channel<\/em> que ahora tiene .NET Core) por una cola circular, sin bloqueos&#8230; y con un hilo dedicado, girando como un demonio constantemente, calentando la CPU y robando recursos. Te\u00f3ricamente, este desperdicio se traducir\u00eda en menos latencia entre procesos&#8230; lo cual incluso puede ser cierto.<\/p>\n<p>A esta idea del bucle en perpetuo movimiento se le a\u00f1ad\u00eda un poco de polvo de hadas: la cola circular estaba pensada para evitar pedir memoria dentro de lo posible (un problema que provoca el propio Java), y estaba todo calculado para evitar cosas con nombres tan feos como el <em>false sharing<\/em> (que es un problema real cuando hay concurrencia). Es decir, por estar hecho en Java, el disruptor era ya la leche&#8230; aunque termin\u00f3 teniendo versiones en C# y supongo que hasta en Python. Toda la mierda que los gatos tiran al suelo termina cayendo en una librer\u00eda de Python y ah\u00ed se hace eterna.<\/p>\n<h4>La cruda realidad<\/h4>\n<p>Como soy incr\u00e9dulo, sobre todo de las cosas que no me gustan, lo que hicimos (la persona inteligente y yo) fue crear una demo. Probamos el disruptor contra la cola bloqueante de serie de Java, y ganaba el disruptor, aunque no por KO. El ganador absoluto, sin embargo, fue una variante de la cola bloqueante, con el a\u00f1adido de recuperar e insertar los elementos en lotes. Es una idea est\u00fapidamente simple y efectiva. Si miras la cola y ves que tienes cuatro elementos pendientes de recuperar, aprovecha y tr\u00e1etelos todos. En Java tienes que ser cuidadoso con estas cosas, y no crear un array cada vez que te traigas <em>n<\/em> objetos, pero esto tiene una soluci\u00f3n tan sencilla como adosar un array a la cola bloqueante en lotes, y reaprovecharlo todo el tiempo.<\/p>\n<p>\u00bfCu\u00e1l era el problema del disruptor? Pues que la idea de quemar un hilo empieza pareciendo atractiva, hasta que te das cuenta de que, si esta filosof\u00eda la sigues aplicando al resto de la aplicaci\u00f3n, te quedas sin CPU en un plispl\u00e1s. Creo que la \u00fanica aplicaci\u00f3n del disruptor que lleg\u00f3 a usarse en mi empresa de entonces fue en un proceso de logging sin bloqueos. Me dio un ataque de risa cuando me lo contaron, y todav\u00eda creo que quien me lo cont\u00f3 bromeaba.<\/p>\n<h4>\u00a1M\u00e1s Java!<\/h4>\n<p>Hay un meme rondando Internet y sacado de una peli barata, sobre un productor musical que todo lo resolv\u00eda a\u00f1adiendo <em>more cowbell<\/em>, es decir, m\u00e1s cencerro, a la pista de percusi\u00f3n de cualquier canci\u00f3n. En el mundo de la programaci\u00f3n, el equivalente es a\u00f1adir m\u00e1s Java a Java. Me explico:<\/p>\n<p>La otra gran decisi\u00f3n a tomar en el par de proyectos paralelos de hace m\u00e1s de diez a\u00f1os era qu\u00e9 \u00edbamos a utilizar para leer y escribir en sockets. Como uno es un idiota iletrado que conoce poco Java, mi razonamiento es que, a no ser que montase una librer\u00eda de muy bajo nivel en c\u00f3digo nativo, cualquier librer\u00eda basada en sockets que no implementase alg\u00fan protocolo experimental no iba a ser mejor que la que ya ven\u00eda en Java. Todas las librer\u00edas de sockets de terceros, y hab\u00eda para escoger, lo \u00fanico que aportaban eran \u00ababstracciones\u00bb como superestructura, que presuntamente pod\u00edan simplificar la programaci\u00f3n, pero jam\u00e1s iban a conseguir que todo fuese m\u00e1s r\u00e1pido. Por eso, yo me qued\u00e9 con los sockets de toda la vida, y mi amigo, que es un experto en Java, se decidi\u00f3 por una librer\u00eda de la famosa fundaci\u00f3n Apache.<\/p>\n<p>Y lleg\u00f3 el d\u00eda del estreno. Mi aplicaci\u00f3n llegaba a leer hasta 250.000 mensajes por cada hilo o canal que habilitase en el proceso. La otra aplicaci\u00f3n revent\u00f3 por un l\u00edmite absurdo que impon\u00eda la librer\u00eda de terceros. El problema se solucion\u00f3, por supuesto, tras algo de trabajo adicional. Pero yo, que soy un idiota, me qued\u00e9 con una moraleja: a\u00f1adir m\u00e1s Java a Java no suele aportar nada de valor.<\/p>\n<h4>Tiempos modernos<\/h4>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2024\/02\/modernTimes.png?resize=260%2C210&#038;ssl=1\" alt=\"\" width=\"260\" height=\"210\" class=\"alignright size-full wp-image-1654\" \/>Como sospechar\u00e1 el lector, nadie saca una historia de hace diez a\u00f1os si no ha pasado algo parecido recientemente. En efecto. Una librer\u00eda escrita en C# resuelve un problema de negocios muy interesante. Pero es una librer\u00eda a secas, y el equipo que la mantiene no da abasto para conectarla a todas las diferentes fuentes de datos posibles. El tiempo de respuesta, adem\u00e1s, es sumamente importante, en este caso.<\/p>\n<p>Entonces apareci\u00f3 un Fervoroso Creyente de la Religi\u00f3n Verdadera, que es Java (y Martin Fowler es uno de sus profetas). La soluci\u00f3n propuesta fue a\u00f1adir Java, y polvos de unicornio. Y, como Java iba a estar obligatoriamente en otro proceso, traer un equivalente moderno del disruptor: una librer\u00eda de comunicaciones que \u00abresuelve\u00bb el problema de la \u00ablatencia\u00bb poniendo un proceso intermedio que gira como un p\u00falsar al que se le ha ido la olla, y un par de hilos en cada extremo haciendo lo mismo. Es decir, la idea del hilo eterno del disruptor multiplicada por tres. Lo probaron en una m\u00e1quina razonable, con s\u00f3lo esos tres componentes: un publicador, el intermediario, y un subscriptor. El invento a\u00f1adi\u00f3 <em>s\u00f3lo<\/em> una decena de microsegundos, o eso me contaron, a la transmisi\u00f3n. Eso ya me habr\u00eda hecho dudar, si lo hubiese sabido a tiempo. El problema es que la aplicaci\u00f3n necesita transmitir datos de unos ocho canales. Tres por ocho, aqu\u00ed y en Javalandia, siempre ha sido igual a veinticuatro. Estoy escribiendo en la m\u00e1quina a la que llamo El Pepino, y que es un Core i9 con 8 n\u00facleos f\u00edsicos y 16 n\u00facleos virtuales por hyperthreading. Es decir, menor estrictamente que veinticuatro.<\/p>\n<p>Creo que todav\u00eda est\u00e1n apretado y soltando tuercas para intentar que la cosa funcione. Best of the luck, my friends.<\/p>\n<p>Promet\u00ed ser breve, pero no lo consegu\u00ed.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intentar\u00e9 ser breve. Hace ya m\u00e1s de diez a\u00f1os, a una persona muy inteligente y a m\u00ed nos pusieron a trabajar a destajo en dos proyectos paralelos en Java cuyo n\u00facleo t\u00e9cnico era bastante parecido: hab\u00eda que enviar precios en una red local a toda leche. Por entonces, Java iba s\u00f3lo por la versi\u00f3n 7, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1646,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[104,105,106],"class_list":["post-1643","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-insights","tag-metodologias","tag-prejuicios","tag-unicornios"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2024\/02\/javaman.png?fit=500%2C500&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/posts\/1643","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/comments?post=1643"}],"version-history":[{"count":13,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/posts\/1643\/revisions"}],"predecessor-version":[{"id":1659,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/posts\/1643\/revisions\/1659"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/media\/1646"}],"wp:attachment":[{"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/media?parent=1643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/categories?post=1643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/tags?post=1643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}