java - ¿Cuándo usar Spring Integration vs. Camel?
jms messaging (10)
Como usuario experimentado de Spring, asumí que Spring Integration tendría más sentido en un proyecto reciente que requiera algunas capacidades de mensajería (JMS) ( más detalles ). Después de algunos días de trabajar con Spring Integration, todavía se siente como una gran cantidad de gastos de configuración dada la cantidad de canales que tiene que configurar para traer algunas comunicaciones de solicitud-respuesta (escuchar en diferentes colas JMS) en su lugar.
Por lo tanto, estaba buscando información de fondo sobre cómo Camel es diferente de Spring Integration, pero parece que la información es bastante sobra, encontré:
- http://java.dzone.com/articles/spring-integration-and-apache (Comparación muy neutral entre la implementación de un escenario de integración real en Spring Integration vs. Camel, desde diciembre de 2009)
- http://hillert.blogspot.com/2009/10/apache-camel-alternatives.html (Comparación de Camel con otras soluciones, octubre de 2009)
- http://raibledesigns.com/rd/entry/taking_apache_camel_for_a (Matt Raible, octubre de 2008)
La pregunta es: ¿qué experiencias hiciste al usar una pila sobre la otra? ¿En qué escenarios recomendaría Camel si a Spring Integration le falta soporte? ¿Dónde ves los pros y los contras de cada uno? Cualquier consejo de proyectos del mundo real es muy apreciado.
Apache Camel es un muy buen marco de trabajo y muy completo, pero si la aplicación se usa en primavera, mi consejo personal es revertir a la integración de primavera. Spring Integration es el marco de quejas de integración EIP del ecosistema Spring-Source. Tiene una muy buena integración con el ecosistema: Spring boot, Batch, XD, incluso el núcleo utiliza la misma abstracción a partir de Spring Framework 4, parte de la abstracción de mensajes se movió en el marco como prueba de que la abstracción básica de mensajes de Spring Integration es muy fuerte, ahora Spring framework, por ejemplo, usa la mensajería abstracta para Spring Web, soporte de socket web. Otra cosa buena en una aplicación de Spring con integración de Spring respecto al uso de Apache Camel es que con la integración de Spring puede usar solo una aplicación Contecxt. Recuerde que el contexto de Camel es un contexto de primavera. si tiene la fortuna de usar una nueva versión de Spring, puedo sugerir el uso de Spring Integration java dsl para la configuración. Lo uso en mis nuevos proyectos y me siento más legible y claro.
Espero que esta reflexión pueda ayudarte para tus evaluaciones
Elegimos Camel sobre Spring-Integration porque la API fluida es realmente agradable. Realmente lo usamos en proyectos de primavera y usamos Spring para configurar una parte. Las API de programación son claras y hay un gran conjunto de componentes sensibles.
Hicimos un tiroteo a pequeña escala y básicamente en ese momento para nuestro requisito que Camel ganó. Lo usamos principalmente para transferir archivos de datos internos a / desde partes externas que generalmente requieren conversiones de formato enviándolo usando ftp / sftp / ... o adjuntándolo a un correo electrónico y enviándolo.
Encontramos que el ciclo de edición-compilación-depuración se ha reducido. Usar Groovy para experimentar la configuración de rutas se agrega bonificaciones.
Spring-Integration también es un gran producto, y estoy seguro de que también satisfaría nuestras necesidades.
En realidad, diría que FTP ha graduado su período de incubación. Puede hacer una búsqueda simple en los foros de SI / JIRA para ver qué nuevas características se implementaron y cuáles fueron corregidos. De varias charlas parece que ya hay un poco de uso de producción, así que sugeriría darle una segunda mirada y por supuesto comunicarnos sus inquietudes a través de nosotros.
http://forum.springsource.org/forumdisplay.php?42-Integration
https://jira.springsource.org/browse/INT
Cheers Oleg
Descargo de responsabilidad: soy committer de integración de primavera
Estamos utilizando Spring Integration para nuestra aplicación y ahora estamos considerando mudarnos a Apache Camel, ya que encontramos muchos problemas con el marco de Spring Integration. Aquí hay un par de problemas.
CachingConnectionFactory que proporciona Spring abre 1000 de conexiones inactivas en IBM MQ y no hay garantía de que estas conexiones se reutilicen. Y aún estas conexiones permanecerán abiertas para siempre, lo que crea problemas en el lado de MQ. Tuve que reiniciar la aplicación cada semana en entornos más bajos solo para actualizar las conexiones. Apache Camel también proporciona almacenamiento en caché y las conexiones parecen subir / bajar según la carga.
Spring no proporciona mapas para los parámetros de QoS. Incluso si habilita la QoS, el modo de entrega y las propiedades de caducidad / timetolive se perderán (plantearé un problema JIRA para esto). Apache Camel maneja esto y los parámetros de QoS se envían a aplicaciones en sentido ascendente y no se descartan.
En este momento estoy trabajando en cuestiones relacionadas con el manejo de las excepciones y transacciones con Apache Camel que Spring parecía manejar mejor con AOP.
La mayoría de las comparaciones de Camel y SI que he visto no tienen en cuenta lo siguiente:
1.) El efecto que Spring Boot ha tenido en la productividad del desarrollador para Spring Integration
2.) El efecto de Spring XD ha sido que las aplicaciones de Spring Integration están disponibles sin compilación de código; también las fuentes y sumideros de Spring XD son simplemente adaptadores de canal Spring Integration, cuando se busca extender Spring XD.
3.) El efecto de Spring XD ha sido lograr unificar Spring Integration, Spring Batch, Spring Data (+ Hadoop!) En una sola pila, trayendo de manera efectiva el procesamiento por lotes y flujo, soporte HDFS / Apache Hadoop y mucho más a Spring Integration.
4.) El efecto de la próxima versión del DSL Java de Spring Integration 4.0 https://github.com/spring-projects/spring-integration-extensions/wiki/Spring-Integration-Java-DSL-Reference
Por tu consideración,
/ Pieter (descargo de responsabilidad que trabajo en Pivotal)
Realmente dependo de lo que quieres hacer. Si necesita ampliar algo para crear su propia solución de mensajería, Spring Integration tiene el mejor modelo de programación. Si necesita algo que admita muchos protocolos sin código personalizado, Camel está por delante de Spring Integration.
Tener una tiroteo a pequeña escala es una muy buena idea, solo asegúrate de tratar de hacer el tipo de cosas que normalmente harías en el proyecto.
--disclaimer: soy un committer de integración de primavera
Recientemente realicé un tiroteo entre Camel vs Spring Integration con el objetivo de integrar Apache Kafka . A pesar de ser un ávido desarrollador de Spring, lamentablemente encontré mi sospecha con el creciente stack de proyectos de Spring confirmado: Spring es increíble como IOC-Container para servir como pegamento para otros frameworks, pero falla al proporcionar alternativas viables a esos frameworks . Puede haber excepciones a esto, es decir, todo lo relacionado con MVC, de donde proviene Spring y donde hace un gran trabajo, pero otros intentos de proporcionar una nueva funcionalidad sobre las características del contenedor son insuficientes por tres razones y el caso de uso de SI Kafka confirma todos ellos:
- Introducción de una DSL difícil de usar y larga para la configuración XML.
- Páginas del código xml-configuration para conectar todos los componentes del framework.
- Faltan recursos para proporcionar funcionalidad a la par con marcos dedicados.
Ahora, volviendo a los resultados de mi tiroteo: lo más importante, estoy impresionado con el concepto general de Camels de las rutas entre los puntos finales . Kafka se integra a la perfección con este concepto y tres líneas de configuración son suficientes para poner todo en marcha. Los problemas encontrados durante el proceso se abordan claramente mediante una amplia documentación del equipo del proyecto , así como una gran cantidad de preguntas sobre . Por último, pero no menos importante, hay una integración integral en Spring que no deja deseos sin cumplir.
Con SI por el contrario, la documentación para la integración de Kafka es bastante intensa y todavía no explica claramente cómo integrar Kafka. La integración de Kafka se ve presionada en la forma SI de hacer las cosas, lo que agrega una complejidad adicional. Otra documentación, por ejemplo, en es también menos abundante y menos útil que para Camel.
Mi conclusión: zapatero se adhiere a tu comercio: utiliza Spring como contenedor y Camel como marco de integración del sistema.
Si su aplicación actual está en Spring y requiere características que sean compatibles con Spring Integration of EIP, la integración de Spring es la mejor opción; de lo contrario, necesitará más soportes / protocolos / formatos de archivo de terceros, etc.
Solo recomiendo Spring Integration si ya tiene un proyecto de Spring y solo tiene que agregar alguna integración "básica" usando File, FTP, JMS, JDBC, y más.
Apache Camel tiene dos ventajas principales:
- Muchas, muchas más tecnologías son compatibles.
- Además, una (buena) DSL XML, hay API fluidas para Java, Groovy y Scala.
Debido a que Apache Camel tiene una muy buena integración con Spring, incluso lo usaría en lugar de Spring Integration en la mayoría de los proyectos de Spring.
Si necesita más detalles, puede leer mis experiencias en la publicación de mi blog: Spoiled for Choice: ¿Qué marco de integración usar - Spring Integration, Mule ESB o Apache Camel?
Una razón para utilizar Camel durante Spring Integration es cuando necesita un conjunto de EIP más funcional. Spring Integration no proporciona abstracciones sobre cosas como ThreadPool.
Camel proporciona construcciones adicionales para simplificar algunos de los aspectos del trabajo con código concurrente:
http://camel.apache.org/camel-23-threadpool-configuration.html
Si no necesita este tipo de cosas y solo quiere conectar archivos, JMS, extremos de FTP, etc., simplemente use Spring Integration.