cancel
Showing results for 
Search instead for 
Did you mean: 

Webservices lentos, ¿es esto normal?

baskeyfield
Champ in-the-making
Champ in-the-making
Muy buenas a todos,

Estoy integrando liferay con alfresco, y para ello estoy creando portlets que ejercen de cliente de servicios web de alfresco. Uno de ellos es un portlet que muestra los ultimos documentos modificados en 2 meses en un espacio y sus espacios hijos. Para realizar esto hago una consulta lucene:

Query query = new Query("lucene","+PATH:\"/app:company_home/cm:"+path+"//*\"+(@cm\\:modified:["+ISO8601DATEFORMAT.format(cal.getTimeInMillis())+" TO "+ISO8601DATEFORMAT.format(fechaActual)+"])+TYPE:\"{http://www.alfresco.org/model/content/1.0}content\"");

Como veis, en la consulta le paso la ruta en la variable "path" para que me busque ahí y en sus hijos, además le indico un rango de modificación al archivo de 2 meses y le indico que sea de tipo  content.

Esta búsqueda puede tardar unos 7-8 segundos para el directorio raiz, con una cifra de documentos inferior a 1000. ¿es normal este tiempo?

1.- ¿Se puede mejorar la consulta para que sea más rápida?
2.- ¿Hay algún parametro de configuración de Alfresco que la agilice?

Mi instalación consiste en un Red hat 64 bits 4gb ram, Mysql 5.0. La jvm está configurada de la siguiente manera:
export JAVA_OPTS='-Xms512m -Xmx2048m -XXSmiley TongueermSize=1024m -XX:MaxPermSize=20428m -server'

Me urge bastante mejorar estos tiempos, puesto que a medida que creza el repositorio se harán impracticables.
Un saludo y gracias.
10 REPLIES 10

pablo_zapico
Champ in-the-making
Champ in-the-making
Yo lo primero revisaria el log para ver si esta dando algun timeout, nosotros teniamos tambien servicios web y el problema de la lentitud venia de eso…

baskeyfield
Champ in-the-making
Champ in-the-making
Gracias Pablo,

He depurado el código, y me he llevado la sorpresa de que lo que realmente tarda no es la consulta, sino lo que hago con mis datos, he impreso los tiempos de mi algoritmo en milisegundos, restando el tiempo que se tarda de un paso a otro:

2010-02-15 15:29:15,439 INFO [portletArrWs] - Antes de ejecutar la consulta 1266247755439 –> Hora actual en milisegundos
2010-02-15 15:29:15,440 INFO [portletArrWs] - Consulta ejecutada 1 –> Tarda 1 ms en ejecutar la consulta
2010-02-15 15:29:20,809 INFO [portletArrWs] - Datos procesados 5369 –> Tarda 5 segundos en procesar los datos!
2010-02-15 15:29:20,810 INFO [portletArrWs] - Datos ordenados 1
2010-02-15 15:29:20,810 INFO [portletArrWs] - Datos impresos 0

Por lo tanto, el problema reside en que hago con los datos que me devuelve, os explico:

Ejecuto una consulta que me devuelve un array de Node. De este array solo necesito los 15 docs mas recientes, pero dado que la clase node no tiene ningun método de ordenación por fecha, recorro ese array de node creandome mi propio objeto "resultadoLucene" que si ordena por fecha modificación. Y esto es realmente lo que tarda el 95% del tiempo total, ya que recorro todos los nodos para generar mi lista de "resultadosLucene" cuando realmente solo deberia recorrer los 15 ultimos.

La solución a este problema sería tan sencilla como en la propia consulta de Lucene poder indicarle que me los ordene por campo cm:modified, pero es esto posible?


Un saludo y gracias.

dewil
Champ in-the-making
Champ in-the-making
Buenas.

Te paso el codigo que aparece en la WIKI (http://wiki.alfresco.com/wiki/Search) para poder ordenar en las querys:


        SearchParameters sp = new SearchParameters();
        sp.addStore(getStoreRef());
        sp.setLanguage(SearchService.LANGUAGE_LUCENE);
        sp.setQuery("PATH:\"//.\"");
        sp.addSort("ID", true);
        ResultSet results = null;
        try
        {
            results = serviceRegistry.getSearchService().query(sp);
            for(ResultSetRow row : results)
            {
                NodeRef currentNodeRef = row.getNodeRef();
                …
            }
        }
        finally
        {
            if(results != null)
            {
                results.close();
            }
        }
        …

*  Sorting is based in Java string ordering
    * This is not so good for numeric data
    * We treat numeric and date information so it does order lexically.
    * Tokenising and sort can give odd results or fail
    * You can only order with one locale.

ESPERO QUE TE SIRVA !!!

Saludos

baskeyfield
Champ in-the-making
Champ in-the-making
Gracias Dewil,

Resulta que cuando puse los println para imprimir los tiempos me equivoqué con el que imprimia el tiempo de la consulta, y puse el println justo antes de la sentencia que ejecuta la busqueda, así que los tiempos reales son estos:

2010-02-15 16:26:38,213 INFO [portletArrWs] - Antes de ejecutar la consulta 1266251198213
2010-02-15 16:26:45,291 INFO [portletArrWs] - Consulta ejecutada 7077
2010-02-15 16:26:45,310 INFO [portletArrWs] - Datos procesados 20
2010-02-15 16:26:45,312 INFO [portletArrWs] - Datos ordenados 2
2010-02-15 16:26:45,312 INFO [portletArrWs] - Datos impresos 0

Como se puede ver, lo que tarda es la consulta y no el procesado de datos. Con lo cual, como puedo optimizarla?

Query query = new Query("lucene","+PATH:\"/app:company_home/cm:"+path+"//*\"+(@cm\\:modified:["+ISO8601DATEFORMAT.format(cal.getTimeInMillis())+" TO "+ISO8601DATEFORMAT.format(fechaActual)+"])+TYPE:\"{http://www.alfresco.org/model/content/1.0}content\"");

¿Se os ocurre alguna idea? He probado a bajar el rango de tiempos a 2 semanas en lugar de 2 meses y tarda lo mismo.

Un saludo.

baskeyfield
Champ in-the-making
Champ in-the-making
Añado más info:

Si la consulta la ejecuto así tarda 6 segundos:
nodes = WebServiceFactory.getRepositoryService().get(new Predicate(null,STORE,query));

Si la ejecuto asi tarda 1 segundo!
QueryResult queryResult = repositoryService.query(STORE, query, false);

El problema es que ejecutandola de la segunda forma solo obtengo el path y el name, no puedo sacar metainformación como fecha de modificación, etc.

Ideas?

Saludos.

pablo_zapico
Champ in-the-making
Champ in-the-making
Quizas podrias tirar por webscripts para obtener los datos

venzia
Star Collaborator
Star Collaborator
Un detalle a tener en cuenta (quiza no para solucionar el problema) :
El MaxPermSize parece desfasado :
export JAVA_OPTS='-Xms512m -Xmx2048m -XXSmiley TongueermSize=1024m -XX:MaxPermSize=20428m -server'
20428m
Saludos,

baskeyfield
Champ in-the-making
Champ in-the-making
Gracias Innovasoft!

Otro dato más, si ejecuto la consulta desde el explorador de nodos no tarda mas de 1 seg, mientras que desde el webservice 6 segundos. Me hace pensar que los metodos para ejecutar consultas desde los ws están muy poco optimizados.

+PATH:"/app:company_home/cm://*"+(@cm\:modified:[2010-01-16T17:43:42 TO 2010-02-15T17:43:42])+TYPE:"{http://www.alfresco.org/model/content/1.0}content"

dewil
Champ in-the-making
Champ in-the-making
Visto que desde el "Node Browser" te funciona correctamente y que es desde el WebService funciona lento, sin entrar en configuracion parecería que la comunicación entre el Cliente y el Servidor es la que ralentiza el proceso…

De todas formas por descartar, ¿puedes detallarnos tu "repository.properties"?