Sobre NoSQL, escalabilidad y otras yerbas

Creo que todos quienes hemos trabajado en desarrollo de sistemas, sobre todo en empresas, pensamos que existe solo un tipo de base datos y todas tienen en común que son SQL.

La vieja guardia es una amplia lista de implementaciones de bases relacionales que utilizan SQL para la definición y consulta de los datos. Estas implementaciones del modelo relacional de Codd han monopolizado el mercado de las bases de datos desde 1970.  40 y tantos anios de hegemonía lo hacen hoy el standard de base de datos mas aceptado, utilizado y probado del mundo.

Pero la tecnología cambia, y hoy las redes y los servicios en la nube imponen nuevos desafíos, y nuevas tecnologías comienzan a demostrar que la vieja guardia no puede adaptarse.

Los nuevos desafios son:

Escalabilidad lineal

Se entiende por escalabilidad a la habilidad de una aplicación de crecer para satisfacer la demanda, sin cambiar el codigo cumpliendo con los parámetros de aceptabilidad del usuario. Una vez de acuerdo en el significado de escalabilidad, decimos que la escalabilidad lineal es la capacidad de crecer tanto como se necesite a un precio fijo por unidad de capacidad de procesamiento adicional.

Escalabilidad elástica

Si ser escalable significa solo crecer para adaptarse a la demanda, ser elástico implica también reducirse. Puede parecer algo trivial pero un sistema que escala no siempre logra reducirse y disminuir su costo de mantenimiento ante una baja en la demanda. En resumen se trata de la capacidad de un sistema de adaptarse a la demanda variable.

Llevar a la practica este concepto necesita mucho mas que la elección correcta de una base datos. Implica que la arquitectura del sistema sea acorde, pero no es el punto de este articulo. Para mas info leer The Scalability Revolution: From Dead End to Open Road .

Tolerante a fallos

Es la capacidad de una base de seguir funcionando (proporcionando acceso r/w a los datos) a pesar de que uno de sus nodos/instancias haya dejado de funcionar. Normalmente esto se resuelve con replicacion pero en los sistemas de base de datos de la vieja guardia esto requiere algun tipo de centralización y por consiguiente genera a la larga un SPOF (Single Point of Failure).

Descentralizada

Que cada nodo en el cluster sea idéntico y no exista un SPOF o cuello de botella de red.

Bemoles

Todas estas cualidades no existen si no se hacen algunas concesiones. Existe un principio o un teorema sobre computacion distribuido conocido como CAP. Que dice que es imposible para un sistema distribuido garantizar que estas tres cualidades se cumplan al mismo tiempo:

  1. Consistencia: todos los nodos ven la misma información todo el tiempo.
  2. Disponibilidad: todos los requests tienen una respuesta siempre.
  3. Tolerante a partición: el sistema continua operando a pesar de perdida de datos.

El teorema dice que solo dos de estas cualidades, a la vez, puede ser satisfechas por el sistema, pero no las tres. En la mayoría de los casos 2 y 3 son garantizadas por las bases NoSQL,  y la 1 es algo que pasa a ser una responsabilidad de la aplicación.

Otra complicación a tener en cuenta es que al ser key-value, sobre todo en las distribuidas, tareas como paginar, buscar o sumarizar  que pueden parecer triviales en en los clásicos SQL, son un verdadero dolor de cabeza en las NoSQL. Lo cual es natural si tenemos en cuenta que los objetos se encuentran replicados en los nodos que componen el cluster. Riak por ejemplo ha incorporando en su versión 1.0 un motor de full-text search Raik Search pero a la hora de una simple paginacion tenemos que recurrir a estructuras complejas que nos permitan simularlo.

Bases de datos NoSQL

Esta una lista de las mas importantes. De las cuales he trabajado con Redis, RavenDB y Riak:

Un paseo por alguna de ellas

RavenDB

Base datos key-value codificada en C#. La misma provee soporte de:

  • Map Reduce
  • Indexing
  • Full-text search
  • Replication (master-slave ok, master-master aun no lo he probado)
  • Key expiration
  • Transactions
  • Slice queries (facil de paginar)
  • Silverlight/HTML  Administration Console.
Pero aun no soporta:
  • Sharding: si bien el codigo del cliente soporta sharding de una manera similar a como lo hace NHibernate, aun falta mucho para que sea aceptable. Hay una serie de bugs reportados y no resueltos con los queries sin indices, y aun no provee soporte de Linq sobre los queries al sharding. Y esta aun lejos de hacerlo dado que debe falta mucho trabajo antes de que RavenDB pueda hacer un query slice, o un map reduce sobre los shards. Si bien permite distribuir el contenido en shard por medio de una estrategia definida por el usuario, una vez implementado se pierden habilidades de consulta claves.
  • Fault tolerant: se que implementa un mecanismo desde el cliente, que aun no he podido probar, pero se basa en la existencia de otras instancias interconectadas por replicacion master-master o master-slave con opción de promover el slave en caso de que el master caiga.
En resumen RavenDB hoy por hoy no es escalable linealmente, el sharding es una mera intención, que en palabras de su creador aun no ha sido probado y por experiencia personal con el codigo fuente de RavenDB dista de estar siquiera en alfa.

Redis

Luego de mi paso por RavenDB, Redis me dio muchas mas satisfacciones pero trajo sus problemas. Hay que reconocer que es realmente veloz pero esta mas cerca de una cache “distribuida” con opción a persistencia que de una base de datos.

Hay que pensar a Redis como una cache con opcion a persistencia y que provee una serie de estructuras de datos sobre el formato key-value como:

  • Hashes
  • Lists
  • Sets
  • Sorted Sets
  • Pub/Sub
  • Transactions
Lo mas interesante es que la API provee comandos atómicos para modificar estas estructuras para garantizar completo soporte de concurrencia. Es muy facil implementar sobre Redis, por ejemplo, una queue dado que las Listas tienen comando LPOP, RPOP, LPUSH, LINSERT, etc. Incluso podemos implementar un rudimentaro sistema de notificaciones para esta queue sobre el servicio Pub/Sub de Redis.
Pub/Sub nos permite hacer broadcast de mensajes por medio de canales a los cuales podemos subscribirnos o publicar mensajes (una cadena de texto plana o un objeto JSON). Sin duda un feature que la distingue del resto.
Algunas librerias que dan soporte de Queues:
  • C# Resques.Net:
    • soporta New Item Notification using Pub/Sub
    • Capped collections
    • Stacks
    • Queues
  • Python QR
  • RestMQ
Como contras, Redis no posee Indices, ni MapReduce, las búsquedas sobre un un dato de los objetos almacenados se debe efectuar uno por uno o en su defecto contemplando el problema en la aplicación desde un comienzo.
En cuanto a escalabilidad, se encuentra planificado Redis Cluster e incluso creo que se puede ser probado una versión alfa, pero actualmente lo único que permite Redis es la replicacion  master-slave.
Para proporcionar Faul-tolerance sobre esta estructura hay que adicionar a nuestra aplicación código para que promueva un slave en caso de error en el master.  Algo realmente poco practico.
En Conclusion, Redis no escalable linealmente. Pero esta efectuando al parecer un intento bastante serio de querer serlo en el futuro. Espero que para 2012 pueda competir con los grandes.

Riak

Actualmente me encuentro probando Riak con un cliente NodeJS llamado riak-js. Riak es una base inspirada en Dynamo y que provee una verdadera arquitectura distribuida. Y lo que es mas importante permite escalabilidad elastica ya que proporciona comandos para atachar nodos al cluster y removerlos sin perdida de datos.

También proporciona Map Reduce e Indices Secundarios y Links (feature muy interesante).  Pero como contra no podemos hacer query slices (escensiales en la paginacion) y ordenamientos. Cada query retorna los datos en un orden diferente ya que depende de como los entreguen los nodos. Link walking y Secondary Indexes son features muy interesantes para tener en cuenta.

En conclusión Riak promete ser escalable linealmente y elástica voy a seguir trabajando con Riak, para entender mejor como resolver problemas básicos como un query slice.

Cassandra

Pronto. Durante el próximo mes me he propuesto instalar y probar esta base de datos que promete, dado su amplia utilización, ser muy completa.

Algunos links de interés:

http://www.elasticvapor.com/

http://www.spotcloud.com/

The Scalability Revolution: From Dead End to Open Road 
An SBA Concept Paper
By Nati Shalom, CTO  |  February 2007

R.I.P. Silverlight y Flash

RIP Creo que lo que el difunto Steve Jobs alguna vez vaticino sobre Flash se cumple. HTML5 crece junto con el segmento mobile y la necesidad de unificar un standard de codificación independiente de la plataforma y que por supuesto no este basada en mágicos generadores de código.

Los frameworks que aprovechan todas las facilidades de HTML5 + CSS3 + JavaScript compiten con aplicaciones nativas en algunos casos mano a mano. Hoy  en dia claramente si buscamos fluides en el UI, velocidad de procesamiento, acceso a  recursos de hardware no podes escapar a utilizar codigo nativo de la plataforma. Pero donde esta necesidad no prima encontramos mayores facilidades en un entorno HTML5.

Ese es el hoy, pero el futuro plantea un escenario en donde las ventajas del codigo nativo no seran tales y las GUI seran tan fluidas en HTML5 como lo son las nativas.

Hoy hay que entender que las plataformas que permiten la utilizacion de HTML5 frameworks son aquellas que poseen navegadores basados en webkit y no son muchas pero si las mas importantes:

  • Apple Safari en su linea Mac OSX, iPad,  iPhone, iPod Touch.
  • Android
  • Chrome
  • etc.
Quienes quedan fuera del juego:
  • Windows Mobile
  • Windows Phone 7
  • Windows 8?
  • RIM (todos sus equipos no touch anteriores al o.s. ver6)
Para cada uno de estos podemos encontrar ad-hoc scripts y HTML pero ninguno cumplimenta el standard HTML5. Algunos de los features que HTML5 provee son:
  • OFFLINE STORAGE
  • DEVICE ACCESS
  • CONNECTIVITY / REALTIME
  • PERFORMANCE & INTEGRATION
  • MULTIMEDIA
  • SEMANTICS
  • GRAPHICS, 3D & EFFECTS
  • CSS3 / STYLING
Al margen, una serie de compras y modificaciones marcan el camino a una unificacion sobre HTML5.
  1. Phonegap fue comprado por Adobe. Para los que no lo conocen Phonegap es un framework de apps. HTML5 que le permite a los desarrolladores un acceso común a las funciones nativas de cada dispositivo: acelerometros, cámara, captura de imágenes, compás digital, conexión, gps, media, notificaciones,  almacenamiento, etc. Como todos sabemos Adobe en su momento habia adquirido Macromedia quien era el creador de Flash y sobre esto baso su tecnologia Air. Con lo cual esto seria un paso decidido de Adobe hacia HTML5. Notas relacionadas: Adobe adquiere Nitobi.
  2. Windows Phone 7 ha anunciado compatibilidad webkit y soporte completo de HMTL5 en sus futuras actualizaciones de Windows Phone 7 que vendrian con IE9. (también incluye en el anuncio la inclusión de soporte para Silverlight, pero no creo que eso haya impactado como lo primero).
  3. Ripple fue comprada por RIM. Si si, el lento y pesado elefante moribundo del mundo mobile, resiste. Ha comprado una empresa cuyo principal producto es un conjunto de herramientas HTML5 y JS que forman una suerte de IDE (siendo muy generoso) que permite emular un dispositivo móvil. Pero no estamos hablando de un simulador iOS o Andriod, sino de un emulador de webkit (en definitiva un iframe en un navegador Chrome) que nos permite jugar con los diferentes tamanos de pantallas, inclinar el dispositivo, actualizar el gps, etc. Todo esto es realizado utilizando Phonegap y alternativas. Con lo cual no estamos hablando de un framework de desarrollo propiamente dicho sino de un entorno o set de herramientas que junto con el debugger de Chrome es una suerte de IDE.
  4. Microsoft apuesta ahora a las Metro Apps para su plataforma Windows 8. Alguien dijo Silverlight? no… de hecho quieren que Windows 8 corra bien en una core i7 como en una tablet con ARM, donde no hay lugar para Flash o Silverlight.
  5. Para Microsoft es oficial:
 ”In a post to the Building Windows 8 blog, Internet Explorer development chief Dean Hachamovich made clear the IE 10 browser in Windows 8 will not support plug-ins. That means that neither flash nor Silverlight will run in IE (though other apps, including other browsers, may support the Flash and Silverlight players.) Instead, Microsoft will follow Apple’s lead and rely on native HTML 5 for rich web applications and media play.”
Microsoft, Apple, Google, Android y ahora Adobe están en la carrera del por el calis sagrado: un framework HTML5 CSS3 JS multiplataforma. Solo espero que en el medio respeten los standards.

Appcelerator Titanium Editors

Titanium es un framework que por el momento carece de un IDE oficial, en cambio hay diferentes intentos por parte de la comunidad de dotar al mismo de un editor que al menos provea highlighthing e intellisense.

Estos aportes son:


Como desinstalar XCode e iOS SDK

Para desinstalar rapidamente abrir un terminal y ejecutar:

sudo /Developer/Library/uninstall-devtools -mode=all

Esto toma su tiempo, una vez terminado si deseamos reinstalar Xcode y el iOS SDK perimero hay que reiniciar Mac OSX.


Appcelerator Titanium

Introducción

Segun la version oficial:

Titanium es un Open Source Framework, para construir aplicaciones Desktop y Mobile nativas utilizando tecnologias web abiertas como JavaScript, HTML5 y CSS.

Titanium permite desarrollar sobre una API JavaScript y portar el proyecto fácilmente a iPhone, iPad, Android y en poco tiempo BlackBerry. Sin duda a simple vista suena excelente pero como todo tiene sus bemoles.

Algunos contra que podemos encontrar son:

  • Lack de documentacion
  • Lack de IDE
  • Lack de Debugger
  • No convierte el codigo JS a nativo. Sino que es solo precompilado y ejecutado en un runtime JS que hace un mapeo directo a las funciones nativas del OS.
  • Los controles no se comportan 100% igual de una plataforma a otra, pequeñas diferencias de render.

    Algunos puntos a favor pueden ser:

    • Open Source. apache 2.0 License
    • Comunidad en constante crecimiento
    • Baja curva de induccion para desarrolladores que tengan conocimiento en JavaScript y HTML/CSS
    • Compatibilidad con iPad, iPhone, Andriod, y pronto BlackBerry en beta
    • Extensible, por medio de Titanium+Plus Modules
    • Acceso a la comunidad Open Source JavaScript
    • Las aplicaciones corren de manera fluida como cualquier otra nativa
    • Reduce los costos de desarrollo

      En realidad no se trata de un compilador Cross-plataforma sino de un runtime que ejecuta linea por linea nuestro JavaScript que ejecuta nuestro código y provee de un puente común para ejecutar codigo nativas de cada OS Mobile. Lo positivo es que permite utilizar HTML5 y CSS e insertar con una baja curva de inducción desarrolladores web a la plataforma Mobile.

      Toda nuestra aplicación puede ser desarrollada en JavaScript y HTML5/CSS, pero como en todos los frameworks de este estilo el gran problema se plantea cuando se requiere alguna funcionalidad o control out of the box.

      Dado que provee un puente que permite ejecutar código nativo por detrás, si deseamos un control especifico que solo puede ser implementado en código nativo Objective-C o Android, debemos utilizar lo que ellos denominan desarrollo de Titanium+Plus Modules que son extensiones para poder invocar código nativo propio.

      En el caso de que necesiten saber mas sobre Titanium+Plus Modules para iPhone sigan el link. Luego de buscar, encontre una guia para Andriod en Titanium+Plus Modules para Android.

      Un buen punto de entrada es comenzar leyendo las Started Guides. Si aun no tenemos la plataforma instalada hay buena informacion de como hacerlo en Mac, Windows y Linux en Get Started. Luego Titanium provee otros puntos de encuentro para la comunidad como un el blog Appcelerant, twiter, irc, etc. Por mi parte lo que más me ayudo a tirar algo de codigo en esta plataforma fueron las Programming Guides.

      Mi sugerencia es hacer la instalacion directamente en Mac OSX donde podremos ver el potencial real de Titanium al poder ver nuestra aplicacion corriendo en iPhone y Andriod al mismo tiempo.

      Si quieren agregarle al ambiente Titanium un IDE con un minimo de auto completar visiten Appcelerator + Aptana + Intellisense.

      Plataforma

      Nuestra aplicacion sera desarrollada principalmente en JavaScript, utilizando la API que Titanium provee en comun para las plataformas mobiles. Titanium precompila el JS y lo empaqueta junto con un runtime y las  clases nativas iPhone o Andriod.

      El runtime  ejecutara nuestro codigo linea por linea y cada invocacion JS a la API de Titanium deriva en una llamada a codigo nativo.

      Teniendo una vision simplicada de este framework, diria que es como tener macros de alto nivel JS que terminan invocando por detras codigo de nativo. Hay que tener en claro que el compilador de titanium precompila el JS para una ejecucion rapida y empaqueta el proyecto, pero NO convierte nuestro codigo en codigo nativo al momento de la compilacion, esto solo sucede durante la ejecucion y por medio del bridge.

      Continuara…


      Usuarios avanzados

      Dado la demora en algunos releases de Titanium SDK 1.5.0, estoy comenzando a probar las “continuous builds” estas se pueden conseguir en http://builds.appcelerator.com.s3.amazonaws.com/index.html.

      Para poder utilizar las nuevas funciones de +Plus Modules for Andriod necesitamos el Titanium Mobile SDK 1.5 el cual solo puede ser encontrado entre las continouos builds. Esta version se encuentra actualmente en QA y esperamos un release para este mes o diciembre.

      Appcelerator Issue Tracker, podemos dejar nuestros issues registrados y seguirlos en https://appcelerator.lighthouseapp.com/dashboard


      AppCelerator Titanium + Aptana + IntelliSense

      Seguramente como la mayoría de los que empezamos con AppCelerator Titanium, y además venimos de C# o Java, quería un IDE con IntelliSense o Autcompletar. Sobre todo porque Titanium no tiene compilación en línea y los errores no pueden detectarse hasta la compilación final el código.
      Continuar leyendo


      Buscando hosting de SVN

      En a busqueda de un hosting SVN que que sea rapido, gratuito, y que permita versionar proyectos que no son Open Source (no por ser propietario sino por verguenza de que cualquiera ver menudo mamarracho) bueno he aqui un excelente indice, con una tabla comparativa de los hosting disponibles y filtros a gusto. http://www.svnhostingcomparison.com/


      Python… por donde empezar?

      Bueno para los que como yo vienen de otros lenguajes de programacion y estan interesados en comenzar con Python creo que conseguir informacion no es lo dificil sino saber elegir.

      Continuar leyendo


      Deskew, enderezando una imagen

      Download:DeskewDemo

      Introduccion

      Cuando trabajamos con imagenes, sobre todo con documentos digitalizados, una de las distorciones habituales es la rotacion.

      En el caso de los las imagenes que contienen texto impreso o figuras rectas (subrayado, cuadros, renglones, etc.) que permitan detectar el grado de inclinacion, es posible rectificar la misma utilizando algunos algoritmos de procesamiento de imagenes y deteccion de patrones.

      Lo primero que deberiamos hacer es encontrar patrones de puntos colineales. Para esto podemos utilizar un algoritmo llamado Hough Transformation.

      Continuar leyendo


      Multilingual Controls in C#, easy!

      Download demo Multilingual

      Introduccion

      Una manera rapida de proporcionar aplicaciones en multiples idiomas en C# es utilizar Culture y Embedded Resources.  Pero aun mas facil con MultilingualForm y MultilingualUserControl.

      Es posible crear archivos .resx que contengan las definiciones para cada idioma y el neutral. Luego ResourceManager permite acceder a las entradas de un recurso para una determinada cultura de la siguiente manera:

      CultureInfo ci = Thread.CurrentThread.CurrentCulture;
      Assembly ass = Assembly.GetExecutingAssembly();
      ResourceManager rm = new ResourceManager(this.GetType().Namespace, ass);
      string res = rm.GetString("tt_hello", ci);

      Continuar leyendo


      Seguir

      Get every new post delivered to your Inbox.