Bloggers recientes

 

[ Blog ]
[ Wiki ]
[ Slideshare ]
[ Twitter ]
[ YouTube ]
Silvia Rodriguez Mensajes: 12
Estrellas: 0
Fecha: 18/12/14
Gustavo Fernandez Mensajes: 69
Estrellas: 7
Fecha: 18/12/14

Archivo

Tags

noBlogo - El blog de zylk.net

La Navidad también ha llegado a zylk
Todos los que trabajamos en zylk queremos desearte una Feliz Navidad y un Próspero Año Nuevo y además, agradecerte como cada año que hayas confiado en nosotros para hacer del software libre y las tecnologías abiertas uno de los pilares que hacen de tu organización un sistema eficiente y competitivo.
 
Disfruta de estas fiestas con la gente importante para tí y coge fuerzas para los retos que nos esperan en  este nuevo año 2015.
 

Zorionak eta Urte Berri On!

 

Configurando liferay para que deje las trazas en colas de kafka

Siguiendo con las pruebas de los productos mencionados en anteriores post, una de las cosas más o menos sencillas que se puede hacer es, configurar los distintos productos que usan log4j para añadirles un nuevo appender de tipo cola de kafka. El propio proyecto de kafka trae un appender para log4j

Para hacer uso del mismo basta con hacer tres cosas

  1. Añadir los siguientes jars al ROOT/WEB-INF/lib de liferay
    1. kafka_2.10-0.8.1.1.jar
    2. metrics-core-2.2.0.jar
    3. scala-library.jar
  2. Crear una cola (tipo topic) con las particiones y replicas que se quiera
    1. ./kafka-topics.sh --create --zookeeper lug000.zylk.net:2181 --replication-factor 3 --partition 3 --topic test-3-3
  3. Añadir la logger de liferay el appender nuevo y añadirlo como referencia

[...]

<appender name="KAFKA" class="kafka.producer.KafkaLog4jAppender">
 <param name="BrokerList" value="lug000.zylk.net:9092,lug002.zylk.ne:9092,lug004.zylk.net:9092" />
 <param name="Topic" value="test-1-1" />
 <param name="ProducerType" value="async" />
 <layout class="org.apache.log4j.EnhancedPatternLayout">
  <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t][%c{1}:%L] %m%n" />

 </layout>
</appender>

[...]

<root>
 <priority value="DEBUG" />
 <appender-ref ref="CONSOLE" />
 <appender-ref ref="FILE" />
 <appender-ref ref="KAFKA" />
</root>

 

Siguiendo estos tres sencillos pasos tenemos las trazas en la consola, en un fichero y en una cola de kafka. Ahora solo quedaría consumirla con algun consumer.

Evidentemente para ponerlo en producción habría que hacer muchas más pruebas y estresar el sistema para ver si funciona como se espera. Por ejemplo hemos detectado un problemilla que habría que solucionar y está relacionado con los retornos de carro (creemos) porque los mensajes que log4j manda a las colas de kafka de alguna manera pierden parte de la información si el mensaje tiene retornos de carro, por ejemplo perdemos el stackTrace (no sabemos si lo hace el publicador o el consumidor que estamos usando para ver el topic creado para las pruebas)

A continuación un pantallazo del consumer que trae por defecto kafka (./kafka-console-consumer.sh --zookeeper localhost:2181 --topic test-1-1 --from-beginning) para ver los topics

Controlando la indexacion de contenido en Alfresco
La característica de indexado automático de los contenidos y metadatos de un documento, es normalmente bienvenida en un gestor documental. Sin embargo, en ciertos casos es deseable no indexar ese contenido, por ejemplo si una aplicación "no hace uso de ese contenido indexado".
 
En Alfresco 4.2 EE tenemos un par de opciones para gestionar el indexado de los documentos:
  • La primera es a través del aspecto cm:indexControl que tiene dos propiedades, cm:isIndexed y cm:isContentIndexed, que por defecto están a true. En este link, tenemos la matriz de combinaciones para controlar los índices de un determinado documento, y podemos indexar metadatos y contenido (por defecto), solo metadatos (cm:isContentIndexed=false) o nada (cm:isIndexed=false). Por supuesto, estas propiedad(es) deben ser seteadas en una carga masiva en donde se controlan estas propiedades via API, o via bulk con el indexador desactivado hasta aplicar la propiedad. También podrían gestionarse a través de una regla o un behaviour.
  • Un segundo método es más global y atiende a modificaciones de ciertas propiedades del servidor SOLR. En SOLR podemos desactivar la indexación del contenido de los documentos global en el archivo solrcore.properties mediante la propiedad (alfresco.index.transformContent=false). De esta manera se deshabilitan las indexaciones "full-text" de todos los documentos puesto que para la indexación Alfresco realiza una transformación previa a texto plano. Añadiendo (alfresco.ignore.datatype.1=d:content) se dejaría sin indexar ni documentos ni metadatos en Alfresco. Además existen propiedades en el solrcore.properties para ignorar tipos, aspectos o propiedades como:
alfresco.ignore.type=<type_name>
alfresco.ignore.aspect=<aspect_name> 
alfresco.ignore.field=<property_name> 
alfresco.ignore.store=<store_name> 
alfresco.ignore.tenant=<tenant_name> 
 
En cualquier caso, es necesario siempre probar bien estos cambios, en el comportamiento por defecto de la indexación de Alfresco, con una herramienta como Luke.
 
Por último, desde el punto de vista del modelo de contenidos es posible siempre setear las propiedades de indexación de cada propiedad o metadato.
 
 
Enlaces:
Aplicaciones escalables de alto rendimiento

Hace un par de semanas acudí a la siguiente charla en la que la gente de linkedin presentaba su solución de alto rendimiento para procesar información. Fue toda una alegría ver que muchos de los conceptos explicados eran temas que en zylk.net llevamos ya algún tiempo aplicando.

  • Procesos desacoplados (Colas y Topics )
  • Websockets para poder desatender las peticiones
  • Base de datos, servicios de colas y de filesystem orientadas a un escalado horizontal (particionado y distribución de keys)
  • etc..

Así que voy a escribir una serie de artículos con las técnicas más básicas para conseguir un rendimiento alto en el desarrollo de nuevos servicios, basandonos en estos conceptos y productos. La idea de diseñar de esta manera las aplicaciones persigue los siguientes objetivos

  • Escalabilidad horizontal a bajo coste
  • Alto rendimiento
  • Tiempos de respuesta bajos

A continuación muestro una imagen de lo que podría ser un servicio de este estilo a nivel general

Donde podemos ver la estructura a tres capas de siempre pero en la que las siguientes técnicas nos permiten mejorar el rendimiento y la esclabildiad del sistema

  1. En la capa inicial de comunicación entre el cliente y el servidor usamos dos técnicas diferentes usando los estándares que java ha definido a tal efecto
    1. WebSockets basados en HTML5 (jsr-365 para las peticiones que llegan al servidor)
    2. Peticiones a servicios rest asíncronos (jax-rs)
  2. En la capa de middle situamos un tomcat8 que implementa sus conectores http y ajp con las liberías NIO de java en esta parte es donde se implementan los servicios asícronos usando dos técnicas
    1. jax-rs asícrono, atendido o desatendido
    2. Servlets asíncronos, atendidos o desatendidos
  3. En la tercera capa simplemente están los productos que hemos mencionado
    1. Colas JMS vs Colas Kafka
    2. Filesystem distribuido basado en HDFS
    3. Sistema de almacenamiento particionado basado en HBase para datos semi estructurados

En un sistema clasico la petición iría del cliente al frontal web, del frontal web al servidor de aplicaciones y del servidor de aplicaciones al backend...y la respuesta realizaría el camino inverso. Todo ello de manera síncrona. Por lo tanto la pendiente que define la recta que representa el numero de peticiones por segundo respecto al numero de usuarios concurrentes depende de la velocidad de una petición unitaria (cuanto más rápida la petición, más pendiente y más peticiones por segundo podrá resolver el sistema, si lo consideramos como un sistema ideal que no tiene límites).

En cambio en un sistema desacoplado y desatendido el número de peticiones que el sistema puede responder no depende de la velocidad de respuesta de una petición unitaria...

Por tanto lo que nos interesa es

  1. Desacoplar las peticiones para que los recursos del frontal web y del middle se devuelvan lo antes posible al pool de peticiones de ambos servidores.
  2. Desatender las peticiones asíncronas (simpre que sea posible) para delegarlas en un sistema de colas y que no se colapse en ningún caso la capa intermedia ni la de backend. Además con este sistema podemos conseguir una expriencias de usuario mejor. El feedback de estos procesos se debería dar por medio de un sistema de websockets precisamente para poder realizar solicitudes desatendidas.

La idea es escribir tres artículos explicando (desde el punto de vista de un desarrollador java) los siguientes puntos de la arquitecutra

  1. WebSockets
  2. JAX-RS asíncrono y Servlets asíncronos
  3. Colas en kafka

Y ahora un pequeño detalle técnico (dos pasos y dos lineas de configuración)  para el apache 2.4.7, necesario para que el frontal pueda hacer de proxy a las peticiones websocket

  • (codigo fuente del módulo proxy de apache) svn co http://svn.apache.org/repos/asf/httpd/httpd/tags/2.4.7/modules/proxy/
  • (compliado del conector para websockets) sudo apxs2 -aic -I /usr/include/libxml2 ./proxy/mod_proxy_wstunnel.c
  • (configuración de los slatos de apache para websockets) ProxyPass /Momo/websocket ws://hefesto.zylk.net:8080/Momo/websocket
  • (configuración de los slatos de apache para websockets) ProxyPassReverse /Momo/websocket ws://hefesto.zylk.net:8080/Momo/websocket
Seguimos jugando con phoenix

Siguiendo con el anterior post relacionado con Phoenix, he estado probando más características que hay que evaluar para ver hasta donde nos puede llevar Phoenix + Hbase+ Pentaho + Saiku.

1) Herramientas de bulk

2) Rendimeinto de las queries

3) Creación de índices secundarios

4) Análisis de los planes de ejecución de las queries

En la imagen podemos ver los resultados de los juegos ... la verdad es que apunta maneras. La siguiente prueba consistirá en recoger los datos de un proyecto típico de BI con pentaho y mysql y pasarlo a Hbase + phoenix ... a ver que pasa, eso sí, tendré que mejorar mi zona de juegos porque el laboratorio se me está empezando a quedar pequeño

Mostrando el intervalo 1 - 5 de 270 resultados.
Resultados por página 5
de 54