Ejecucion asincrona usando el framework java.util.concurrent

Siguiendo con el diseño de aplicaciones de alto rendimiento vamos a ver como se podría mejorar el rendimiento de la siguiente parte del gráfico general

 

donde vemos que hay una librería (cliente) que se integra en otra aplicación. Lo fundamental en este caso es que la librería cliente no penalice, o penalice lo menos posible, el tiempo de ejecución de la aplicación original. Por ejemplo si el cliente es una librería de trazas lo idoneo es que el tiempo de ejecución del método de la aplicación sea el mismo con las trazas activadas que con las trazas desactivadas.

Si partimos de este esquema y aplicando las dos siguientes premisas

  • No es importante la garantía de entrega.
  • No es requisito procesar la respuesta de la petición realizada para hacer lógica sobre el programa principal.

Podemos hace uso del framework java.util.concurrent para mejorar mucho el tiempo. Pasando de ejecutar 10000 envios en 60 degundos a 10000 envios en  menos de 1 segundo. Es decir mejoramos la sensación del rendimiento al usar la librería cliente en un x100, que es uno de los objetivos que pretendíamos.

Un par de snippets de como hacer una petición rest desde un cliente usando esta técnica

donde vemos como se realizaría la petición de manera sincrona.

donde vemos como se realizar la petición asincrona

Entrada publicada en Sin categoría | Comentarios cerrados

Implementando servicios REST con jaxrs sustituyendo JSON por Protocol Buffer

Una de las particularidades de las orientaciones SOA es que servicios consumen servicios, y desde hace un tiempo ya estos servicios no se orientan a SOAP con webservices si no que se orientan más a servicios más ligeros basados en REST. En la siguiente firgura podemos ver un ejemplo de lo comentado

Donde podemos ver, serialización y des-serialización basada en JAXB, exposición de servicios usando JAX-RS y sobre todo vemos que el objeto intercambiado entre los servicios (Book) se transporta en formato JSON entre el consumidor y el publicador del servicio.

Esto está bien como primera aproximación pero lo mismo que hace 10 años se intercambiaban XMLs y pasamos a JSON ahora parece que sería interesante pasar de JSON a alugno de los protocolos binarios que aportaán más velocidad y por ende más rendimiento. Los candidatos principales son (Avro y Protobuf).

Una vez que tenemos claro el objetivo, ¿cómo podríamos hacerlo?, en realidad revisando el diagrama anterior parece que debería ser sencillo hacer el cambio. Para ello solo hay que registrar un nuevo protcolo para que JAXRS lo identifique y sea capaz de gestionarlo. Tenemos que implementar las siguientes dos clases (javax.ws.rs.ext.MessageBodyReader y javax.ws.rs.ext.MessageBodyWriter)  que le indican al servicio como tiene que leer la información de la petición REST y como tiene que escribir la respuesta. Siguiendo este artículo podemos ver como se hace esto para Protobuf. Además para poder completar el ejemplo hay que seguir un manual de Protobuf  de los muchos existentes en internet.

Para hacer lo mismo con Avro habría que implemntar estas dos clases y definir un nuevo tipo de contenido por ejemplo application/avro. Con esto podríamos tener servicios que consuman y devuelvan peticiones con objetos serializados en Avro o en Protobuf igual que hacemos con los servicios que exponen JSON

Entrada publicada en Sin categoría | Comentarios cerrados

Algunos consejos sobre la aplicación de la Ley 25/2013 de Impulso de Factura Electrónica

 

A lo largo de las últimas semanas hemos podido ver cómo se multiplicaban las noticias sobre la la ley 25/2013 de 27 de Diciembre de Impulso de la factura electrónica que se aplicará a partir del próximo 15 de Enero de 2015. Esta ley tiene por un lado el objetivo de proteger al proveedor de la administración, y por otro el de mejorar el seguimiento del cumplimiento de los compromisos de pago de las administraciones, mejorando el gasto público y controlando el déficit.

Por esta razón a partir de mediados de este mes, será obligatorio para las empresas que facturen a la administración y sus organismos autónomos la expedición y remisión de facturas en formato electrónico, quedando exentas las facturas de importe igual o inferior a 5.000 € para las cuales podrás elegir entre el formato electrónico o el tradicional formato papel.

 

 

Así que si te cuentas entre los proveedores de la administración o tienes previsto convertirte en proveedor, desde zylk.net queremos darte un par de consejos para que la transición al uso de factura electrónica sea lo más natural posible.

 

  1. Si todavía no dispones de un certificado, solicítalo en alguna de las Entidades de Certificación existentes (Izenpe, FNMT, Camerfirma...). Como ciudadanos todos disponemos del DNI electrónico, pero existen certificados de Entidad para las empresas y están disponibles tanto en formato tarjeta como en Token USB.

  1. Elijas la herramienta que elijas para generar tu factura electrónica, recuerda que el único formato que será aceptado es el facturae 3.2 y 3.2.1. El ministerio dispone de una herramienta gratuita a tal efecto pero existen otras que además de emitir facturas electrónicas ofrecen funcionalidades extra como por ejemplo Efaktur, que te permitirá conservar borradores de las facturas aún por emitir, generar estadísticas del estado de tus facturas (borrador, emitidas, rectificadas, etc), consultar el histórico de envíos realizados o hacer desgloses de IVA tanto en facturas enviadas como recibidas.

  1. Es tan importante emitir una factura como conservarla. La legislación vigente (Ley 58/2003 de 17 de Diciembre) exige su conservación por un período mínimo de 6 años, por lo que sistemas de gestión documental como Alfresco ECM son de gran ayuda cuando tratamos con este tipo de información en las organizaciones.

 

Si aún así la factura electrónica te sigue asustando, en zylk.net te ofrecemos varias opciones para que le pierdas el miedo. Como expertos en firma digital y factura electrónica podemos asesorarte y ayudarte a elegir la solución que más se adecúa a tu caso particular. Además, si ya tienes una solución de factura electrónica pero necesitas formación en firma digital para utilizar de forma adecuada tu herramienta, también podemos ayudarte.

Ponte en contacto con nosotros por teléfono en el 944 272 119 o por email en info@zylk.net y dinos qué podemos hacer por ti.

Entrada publicada en Sin categoría | Comentarios cerrados

Algunos consejos sobre la aplicación de la Ley 25/2013 de Impulso de Factura Electrónica

 

A lo largo de las últimas semanas hemos podido ver cómo se multiplicaban las noticias sobre la la ley 25/2013 de 27 de Diciembre de Impulso de la factura electrónica que se aplicará a partir del próximo 15 de Enero de 2015. Esta ley tiene por un lado el objetivo de proteger al proveedor de la administración, y por otro el de mejorar el seguimiento del cumplimiento de los compromisos de pago de las administraciones, mejorando el gasto público y controlando el déficit.

Por esta razón a partir de mediados de este mes, será obligatorio para las empresas que facturen a la administración y sus organismos autónomos la expedición y remisión de facturas en formato electrónico, quedando exentas las facturas de importe igual o inferior a 5.000 € para las cuales podrás elegir entre el formato electrónico o el tradicional formato papel.

 

 

Así que si te cuentas entre los proveedores de la administración o tienes previsto convertirte en proveedor, desde zylk.net queremos darte un par de consejos para que la transición al uso de factura electrónica sea lo más natural posible.

 

  1. Si todavía no dispones de un certificado, solicítalo en alguna de las Entidades de Certificación existentes (Izenpe, FNMT, Camerfirma...). Como ciudadanos todos disponemos del DNI electrónico, pero existen certificados de Entidad para las empresas y están disponibles tanto en formato tarjeta como en Token USB.

  1. Elijas la herramienta que elijas para generar tu factura electrónica, recuerda que el único formato que será aceptado es el facturae 3.2 y 3.2.1. El ministerio dispone de una herramienta gratuita a tal efecto pero existen otras que además de emitir facturas electrónicas ofrecen funcionalidades extra como por ejemplo Efaktur, que te permitirá conservar borradores de las facturas aún por emitir, generar estadísticas del estado de tus facturas (borrador, emitidas, rectificadas, etc), consultar el histórico de envíos realizados o hacer desgloses de IVA tanto en facturas enviadas como recibidas.

  1. Es tan importante emitir una factura como conservarla. La legislación vigente (Ley 58/2003 de 17 de Diciembre) exige su conservación por un período mínimo de 6 años, por lo que sistemas de gestión documental como Alfresco ECM son de gran ayuda cuando tratamos con este tipo de información en las organizaciones.

 

Si aún así la factura electrónica te sigue asustando, en zylk.net te ofrecemos varias opciones para que le pierdas el miedo. Como expertos en firma digital y factura electrónica podemos asesorarte y ayudarte a elegir la solución que más se adecúa a tu caso particular. Además, si ya tienes una solución de factura electrónica pero necesitas formación en firma digital para utilizar de forma adecuada tu herramienta, también podemos ayudarte.

Ponte en contacto con nosotros por teléfono en el 944 272 119 o por email en info@zylk.net y dinos qué podemos hacer por ti.

Entrada publicada en Sin categoría | Comentarios cerrados

Monitorizando el cluster de hadoop y kafka con Ganglia

Siguiendo con los artículos anteriores relacionados con los nuevos paradigmas del desarrollo, hemos montado en el laboratorio donde hacemos las pruebas, en zylk.net, un sistema de monitorización para tener métricas de los siguientes productos

  • Sistema operativo
  • HDFS
  • MAP&REDUCE (yarn)
  • Hbase
  • Kafka

Todos estos productos ya los hemos ido describiendo en anteriores entradas del blog y ahora lo que hemos hecho es agrupar todas las metrircas que los mismos producen y almacenarlas usando el siguiente producto (ganglia). Esto se puede hacer porque detrás de todos los productos java que estamos usando existe una librería java (yammer) que es capaz de recolectar las métricas definidas por los desarolladores y publicarlas en distintos formatos. En este caso en un formato válido para Ganglia. Con esto lo que tenemos son las métricas de los productos en una herramienta centralizada para poder explotarla.

 

El proceso en relativamente sencillo yo he seguido estos manuales

https://www.digitalocean.com/community/tutorials/introduction-to-ganglia-on-ubuntu-14-04 (manual general para configurar ganglia)

http://www.javacodegeeks.com/2013/04/ganglia-configuration-for-a-small-hadoop-cluster-and-some-troubleshooting.html (manual para configurar hadoop y hbase)

Para la parte de kafka he usado el siguiente plugin/librería

https://github.com/myfitnesspal/kafka-statsd-reporter

La configuración que he realizado tiene dos clusters (uno de servidores apache web y otro con los nodos del laboratorio de bigdata)

En el cluster de hadoop-zoo-services disponemos de todas las metricas que los desarrolladores han puesto a nuestra disposición, son más de 200 metricas relacionadas con los tres productos principales que son hdfs, hbase y kafka. Con estas metricas podemos ver el estado de lo nodos, el numero de tablas y regiones en hbase, el numero de mensajes procesados por segundo en una cola concreta de kafka... vamos mucha mucha información.

La configuración que hemos probado es la siguiente

  • Comunicación multi-cast entre los ganglia moniotors y el recolector de la información
  • Dos grupos/clusters para porbar el mutli-cluster en una sola intancia de ganglia

Lo idea dado el numero de servicios y metricas que los productos aportan sería montar una representación lógica por servicio y así agrupar las metricas por servicio, por ejemplo

  • Kafka
  • HDFS
  • HBase

Ya que si se agrupa en estructura física como lo hemos montado ahora, son demasiadas métricas para cada nodo del cluster y no es fácil encontara la información relacionada.

Una tema que nos quedaría pendiente es integrar todo esto con el modelo de desarrollo para ello, siguiendo lo que hacen los productos que hemos analizado bastaría con incluir la libería yammer a nuestros desarrollos para poder obtener las metricas en el formato que ganglias las entienda y poder así tener también monitorizado el estado de nuestros desarrollos, ya sean desarrollo basados en bigdata, ya sean desarrollo normale de java web.

Entrada publicada en Sin categoría | Comentarios cerrados

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!

 

Entrada publicada en Sin categoría | Comentarios cerrados

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

Entrada publicada en Sin categoría | Comentarios cerrados

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:
Entrada publicada en Sin categoría | Comentarios cerrados

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
Entrada publicada en Sin categoría | Comentarios cerrados

Linux para niños

Seguro que tienes un ordenador o portátil antiguo que ya no lo usas, ¿verdad? Pues ahora que se acerca la navidad te vamos a dar una idea para que puedas volver a revivirlo y de paso poder hacer un fabuloso regalo a tus hijos, sobrinos, amigos… sin gastar ni un euro.

Una de las ventajas de GNU-Linux es la posibilidad que tiene para poder ejecutarse en equipos antiguos. Esto unido a distribuciones especificas y gratuitas nos da la oportunidad de crear un centro educativo y de entretenimiento para los pequeños de la casa.

 

qimo

Qimo for kids

Sistema operativo basado en Xubuntu. Qimo trae pre-instalado software educativo para que los pequeños aprendan jugando e interactuando en diferentes actividades.
La interfaz de Qimo está diseñada para que sea fácil su uso, con iconos grandes, expresivos y llamativos.

Requerimientos de hardware:
– Procesador: 400MHz o superior.
– 200MB de RAM.
– 6GB de disco duro.

Página web: Qimo for kids

 

PicarOS

Esta distribución esta basada en Debian y está recomendada para niños a partir de los 3 años. Tiene un escritorio pensado para que sea cómodo y agradable para los mas pequeños. Está disponible en español, catalán e inglés.

Requerimientos de hardware:
– Procesador: 1.0GHz o superior.
– 256MB de RAM.
– 3,6GB de disco duro.

Página web: PicarOS

 

DoudouLinux

DoudouLinux

Un sistema con el fin de hacer que el uso del ordenador sea una tarea fácil y divertida para niños a partir de 2 años. Además contiene un sistema parental para prevenir que los niños puedan acceder a contenido inapropiado en Internet. Esta distribución está en formato auto-ejecutable, esto es, podrás ejecutarlo a través de un CD o pendrive sin que tengas que reinstalar tu sistema operativo actual y sin perder ningún dato.

Requerimientos de hardware:
– Procesador: 800MHz o superior.
– 256MB de RAM.
– 3,6GB de disco duro.

Página web: DoudouLinux

 

edubuntu_scr

Edubuntu

Es una distribución basada en Ubuntu, orientada para el uso en ambientes escolares. Su lista de paquetes está destinada a tal fin, incorporando aplicaciones educativas como Gcompris y The KDE Education Project. Edubuntu esta dirigido a niños y jóvenes de entre 6 y 18 años.

Requerimientos de hardware:
– Procesador: 1000MHz o superior.
– 512MB de RAM mínimo.

Página web: Edubuntu

El artículo Linux para niños fué publicado originalmente en Elurnet Informatika Zerbitzuak S.L..

Entrada publicada en Software libre, distribución, educación, gnu-linux, linux, niños, noticias | Comentarios cerrados