Me han pedido que diseñe e implemente un sistema para recibir un gran volumen de datos de sensores automáticos de una gran cantidad de dispositivos. Esta información se producirá a intervalos regulares y se enviará al servidor como xml en una publicación HTTP. Los dispositivos seguirán reenviando los mismos datos si no reciben un acuse de recibo específico del servidor. Antes de que se inserte en una serie de tablas en la base de datos principal a través de una transacción, es necesario que se produzca algún procesamiento potencialmente pesado de estos datos, y adicionalmente algunos puntos de datos tendrán que ser enrutados para ser redirigidos a otras URL externas.Posibles trampas al usar una cola JMS?
Estoy planeando usar un servidor de aplicaciones Java (inclinado hacia GlassFish) con un servlet para recibir los datos entrantes. Me gustaría implementar algún tipo de mecanismo de cola para almacenar los datos temporalmente para que la respuesta al sensor no dependa de todo el procesamiento intermedio. Las colas independientes independientes también son un requisito para la pieza de redirección de datos. Después de investigar un poco, las dos opciones principales parecen ser:
1) Instale una base de datos en el servidor de aplicaciones y use tablas para las diversas colas. Las colas serían procesadas por una aplicación Java, ya sea ejecutándose en el servidor de la aplicación o de forma independiente como su propio servicio.
2) Use una solución JMS respaldada por la base de datos para implementar la puesta en cola.
No estoy tan familiarizado con JMS, pero por lo que he leído, parece ser la mejor solución en este caso. El requisito principal es que nunca se pierda ni se pierda ningún dato del sensor de la cola antes de su procesamiento y que se procese más o menos secuencialmente. También nos gustaría que sea más fácil detener el procesamiento de algunas de las colas en ciertos momentos, pero aún así hacer que acumulen datos y que estos mensajes nunca expiren automáticamente.
Con la estrategia 1 es obvio para mí cómo cumplir estos requisitos, pero puede ser menos robusto y escalable, y más complejo de desarrollar que la estrategia 2, ya que tendré que escribir mi propio código multiproceso para manejar el varias colas independientes. Me pregunto cuáles podrían ser las posibles dificultades al usar colas JMS para este fin, ya que nunca antes había trabajado con ellos.
La integridad de los datos es un gran problema, así que necesito asegurarme de que JMS no pueda garantizar la pérdida de datos en caso de reinicio del servidor, corte de energía o cola por algún motivo. Por ejemplo, ¿podría un problema completar las transacciones en la base de datos principal durante un período de tiempo que podría hacer que la JVM se quedara sin memoria, bloquearse y perder todos los datos acumulados? (Este sería el escenario de pesadilla).
Además, me preguntaba si habría alguna forma de pausar el proceso de cola JMS a través de una herramienta de administración del servidor de aplicaciones o ver fácilmente lo que está en la cola (estaría enquistando un objeto que sería el mensaje xml más algunos otros datos, incluida la marca de tiempo recibida, etc.) He leído algunas publicaciones aquí que tratan sobre temas relacionados, pero quería obtener algunos comentarios directos. Básicamente me gustaría saber de instancias (si las hay) donde JMS no es una solución de cola adecuada y si este es uno de esos casos. Cualquier consejo es muy apreciado.
No es un tipo de Java en absoluto, pero ¿esto no implica esperar en una cola de respuesta para que los resultados respondan? Esto parecería ser un factor decisivo si su protocolo de cliente es HTTP. ¿No tendrá esto que atar un hilo? – Bob77
En realidad, tengo dos escenarios de colas separados con los que tengo que lidiar. Uno es una cola a la base de datos principal, que sería una conexión a través de un grupo de conexiones jdbc. Esto es en lo que escribiría el servlet. El otro contendría un subconjunto de estos datos, que se colocarían en esta cola separada después de procesarse con éxito en la cola principal. El consumidor de esta cola enviará el mensaje a través de http a otro sitio. Esto significaría que la respuesta del servlet inicial estaría separada por dos colas del resultado de la publicación http al sitio de terceros. – user256447