{"id":9,"date":"2009-08-23T15:02:00","date_gmt":"2009-08-23T13:02:00","guid":{"rendered":"http:\/\/beta.expertosenti.com\/2009\/08\/%c2%bfdonde-guardo-los-contenidos-generados-por-los-usuarios\/"},"modified":"2017-04-24T16:48:51","modified_gmt":"2017-04-24T14:48:51","slug":"donde-guardo-los-contenidos-generados-por-los-usuarios","status":"publish","type":"post","link":"https:\/\/www.xpnti.net\/es\/donde-guardo-los-contenidos-generados-por-los-usuarios\/","title":{"rendered":"\u00bfD\u00f3nde guardo los contenidos generados por los usuarios?"},"content":{"rendered":"<p>El otro d\u00eda estaba discutiendo con un cliente del sector del Social Media (mucho Web 2.0) sobre d\u00f3nde era mejor guardar los contenidos que suban los usuarios, si en disco, en base de datos o en el cloud (<a href=\"http:\/\/aws.amazon.com\/s3\/\">Amazon S3<\/a>, <a href=\"http:\/\/www.nirvanix.com\/\">Nirvanix<\/a>, <a href=\"http:\/\/www.rackspacecloud.com\/cloud_hosting_products\/files\">Rackspace Cloud Files<\/a>, etc&#8230;).<br \/>No hay una respuesta de cu\u00e1l es mejor o pero en cualquier caso, pero si restringimos la casu\u00edstica a un site con contenido generado por usuario (ugc o user-generated content) y con m\u00e1s de un servidor que sirva nuestro contenido (ya sea por rendimiento o por disponibilidad) tenemos un perdedor, guardarlo directamente a disco. \u00bfY por qu\u00e9?<\/p>\n<ol>\n<li>Si tenemos m\u00e1s de un nodo nos debemos asegurar que todos los nodos puedan ver el mismo contenido. Sino, cuando un usuario acabe de actualizar su foto del perfil, sus amigos ver\u00e1n un error 404 de fichero no encontrado, excepto si han ido a parar al mismo servidor.<\/li>\n<li>Si ponemos un sistema de replicaci\u00f3n multimaster (rsyncs cruzados, por ejemplo) podemos tener colisiones de nombres (dos usuarios han subido el fichero foto.jpg en nodos diferentes y el rsync nos lo ha sobrescrito) o tener problemas puntuales que afectaran a los usuarios dando mala imagen,desde que se sube un fichero hasta que est\u00e1 replicado (cada X minutos) estaremos entregando errores 404<\/li>\n<li>Pues pongamos un almacenamiento compartido,por ejemplo <a href=\"http:\/\/en.wikipedia.org\/wiki\/Network_File_System_%28protocol%29\">NFS<\/a>, aparte de los problemas de escalabilidad en entornos con mucha escritura (es bastante mejorable la gesti\u00f3n de bloqueos en NFS), mejor que desambiguemos el nombre del fichero a un id \u00fanico o bien a\u00f1adiendo el nombre del servidor que lo escriba (foto.server1.jpg).<\/li>\n<li>Vale, NFS es malo, pues qu\u00e9 tal un <a href=\"http:\/\/en.wikipedia.org\/wiki\/OCFS\">OCFS2<\/a> o <a href=\"http:\/\/en.wikipedia.org\/wiki\/Global_File_System\">GFS<\/a>, pues aunque son sistemas que dan un rendimiento muy superior al NFS, tienen el mismo problema con las escrituras, demasiadas escrituras con demasiados nodos, los tienden a afectar demasiado. Tanto NFS\/<a href=\"http:\/\/en.wikipedia.org\/wiki\/CIFS\">CIFS<\/a> como GFS\/OCFS2, son perfectos para entornos con poco ratio de escrituras (ecommerce, noticias, blogs, etc)<\/li>\n<li>Tambi\u00e9n, parte del problema de tener un entorno para ficheros, ya teniendo un entorno de base de datos (es raro el site actual si base de datos detr\u00e1s), es que nos tenemos que preocupar de tener un entorno de alta disponibilidad, backup, etc adicional.<\/li>\n<\/ol>\n<p>As\u00ed que nos quedan dos entornos externos que de alguna forma los podemos ver como accesos a nivel de aplicaci\u00f3n y menos a nivel de sistema. De esta forma tenemos m\u00e1s opciones para adaptar el comportamiento a lo que nos interesa.<br \/>En el caso de guardar los datos en <span style=\"font-weight: bold;\">base de datos<\/span>, tenemos pros y contras:<br \/><span style=\"font-size:130%;\"><span style=\"font-weight: bold;\">Pros<\/span><\/span><\/p>\n<ol>\n<li>Seguro que no tenemos problemas de colisiones<\/li>\n<li>Nos permite guardar metadatos para poder mejorar la gesti\u00f3n del espacio<\/li>\n<li>Nos aprovechamos de todas la mejoras existentes para el accesos en base de datos (memcache, librerias, APIs, etc)<\/li>\n<li>Facilidad para backups, replicaciones, gesti\u00f3n, alta disponibilidad, etc&#8230;<\/li>\n<\/ol>\n<p><span style=\"font-size:130%;\"><span style=\"font-weight: bold;\">Contras<\/span><\/span><\/p>\n<ol>\n<li>Lectura lenta comparada con acceso a disco<\/li>\n<li>Capacidad de disco necesaria<\/li>\n<\/ol>\n<p>Pero podemos solucionar los contras de forma bastante simple:<\/p>\n<ol>\n<li>Utilizar el disco del servidor Web como cache de los ficheros m\u00e1s demandados y si disponemos de suficiente ram, aprovechar herramientas como <a href=\"http:\/\/en.wikipedia.org\/wiki\/Memcached\">Memcached<\/a>, <a href=\"http:\/\/ehcache.org\/\">Ehcache<\/a> o <a href=\"http:\/\/blogs.msdn.com\/velocity\/\">Velocity<\/a><\/li>\n<li>Utilizar shards para separar contenidos y permitir escalar. <a href=\"http:\/\/arquitectura.expertosenti.com\/2009\/08\/escalar-la-base-de-datos-sharding.html\">Tal y como he escrito en el post anterior<\/a><\/li>\n<\/ol>\n<p>Y por \u00faltimo nuestro amigo cloud. En base a los precios y servicios actuales, los servicios se posicionan en la gama media de sites, si nuestro site tiene muchos datos o mueve mucho tr\u00e1fico, seguramente nos salga m\u00e1s a cuenta hospedarlos nosotros, y si por el contrario movemos muy poco tr\u00e1fico, es muy probable que nuestro proveedor de hosting nos d\u00e9 suficiente espacio y ancho de banda para alojarlo nosotros mismos. Esto si, sin perder de vista que luego tenemos que hacer la gesti\u00f3n de capacidad y poder aguantar los picos que esperemos y los que no \ud83d\ude42<br \/>As\u00ed que a parte de controlar los costes, debemos tener en cuenta:<\/p>\n<ul>\n<li>Si queremos control exhaustivo desde d\u00f3nde se acceden los archivos, lo deberemos hacer pasar por nuestro servidor y aplicar la pol\u00edtica adecuada, con lo cual pagaremos 2 veces por el mismo ancho de banda.<\/li>\n<li>Puede existir cierta latencia en la creaci\u00f3n del archivo en el proveedor de cloud, afectando al rendimiento de nuestra aplicaci\u00f3n o posibles ca\u00eddas de rendimiento y\/o servicio externas que afecten al nuestro.<\/li>\n<li>Si dejamos los ficheros \u00abp\u00fablicos\u00bb, cualquiera puede establecer un enlace directo y gastarnos dinero sin darnos opciones de monetizarlo, as\u00ed que mejor, cuidado.<\/li>\n<\/ul>\n<p>As\u00ed que ya hab\u00e9is visto, no existe la panacea, pero, al menos desde mi punto de vista, si quer\u00e9is un site que escale a muchos usuarios -> muchos servidores, mejor tener el control de los ficheros a nivel de aplicaci\u00f3n, y ahora mismo esto implica, o soluciones Cloud o soluciones basadas en Base de Datos.<\/p>\n<p>Y ya sab\u00e9is, comentarios bienvenidos \ud83d\ude42<\/p>\n<p>Saludos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El otro d\u00eda estaba discutiendo con un cliente del sector del Social Media (mucho Web 2.0) sobre d\u00f3nde era mejor guardar los contenidos que suban los usuarios, si en disco, en base de datos o en el cloud (Amazon S3, Nirvanix, Rackspace Cloud Files, etc&#8230;).No hay una respuesta de cu\u00e1l es mejor o pero en<a href=\"https:\/\/www.xpnti.net\/es\/donde-guardo-los-contenidos-generados-por-los-usuarios\/\">[&#8230;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[11,12,13,14,15],"tags":[],"_links":{"self":[{"href":"https:\/\/www.xpnti.net\/es\/wp-json\/wp\/v2\/posts\/9"}],"collection":[{"href":"https:\/\/www.xpnti.net\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xpnti.net\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xpnti.net\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xpnti.net\/es\/wp-json\/wp\/v2\/comments?post=9"}],"version-history":[{"count":1,"href":"https:\/\/www.xpnti.net\/es\/wp-json\/wp\/v2\/posts\/9\/revisions"}],"predecessor-version":[{"id":1970,"href":"https:\/\/www.xpnti.net\/es\/wp-json\/wp\/v2\/posts\/9\/revisions\/1970"}],"wp:attachment":[{"href":"https:\/\/www.xpnti.net\/es\/wp-json\/wp\/v2\/media?parent=9"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xpnti.net\/es\/wp-json\/wp\/v2\/categories?post=9"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xpnti.net\/es\/wp-json\/wp\/v2\/tags?post=9"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}