Wann sollte Spring Integration vs. Camel verwendet werden?

138

Als erfahrener Spring-Benutzer ging ich davon aus, dass Spring Integration in einem kürzlich durchgeführten Projekt am sinnvollsten ist, für das einige (JMS) Messaging-Funktionen erforderlich sind ( weitere Details ). Nach einigen Tagen mit Spring Integration scheint es immer noch ein großer Konfigurationsaufwand zu sein, wenn man bedenkt, wie viele Kanäle Sie konfigurieren müssen, um eine Anfrage-Antwort-Kommunikation (Abhören verschiedener JMS-Warteschlangen) zu ermöglichen.

Daher habe ich nach Hintergrundinformationen gesucht, wie sich Camel von Spring Integration unterscheidet, aber es scheint, dass Informationen da draußen ziemlich sparsam sind. Ich fand:

Die Frage ist: Welche Erfahrungen haben Sie mit der Verwendung des einen Stapels über dem anderen gemacht? In welchen Szenarien würden Sie Camel empfehlen, wenn Spring Integration nicht unterstützt wird? Wo sehen Sie Vor- und Nachteile von jedem? Jeder Rat aus realen Projekten wird sehr geschätzt.

ngeek
quelle
4
Angesichts der absolut fantastischen Integration, die Camel in Spring hat, sehe ich überhaupt keinen guten Grund, mir Spring Integration überhaupt anzuschauen. Camel zeichnet sich in jedem Bereich aus: prägnant, intuitiv, leistungsstark, ... unterhaltsam. Mit einer einzigen Codezeile können Sie so viel erreichen, dass ich mich manchmal schuldig fühle, nicht genug Code geschrieben zu haben, um die Funktionalität zu rechtfertigen.
Pavel Lechev

Antworten:

75

Wir wählen Camel anstelle von Spring-Integration, weil die fließende API wirklich gut ist. Wir verwenden es tatsächlich in Spring-Projekten und verwenden Spring, um einen Teil davon zu konfigurieren. Die Programmier-APIs sind klar und es gibt eine große Anzahl sinnvoller Komponenten.

Wir haben ein kleines Shootout gemacht und im Grunde genommen hat Camel damals für unsere Anforderung gewonnen. Wir verwenden es hauptsächlich, um interne Datendateien an / von externen Parteien zu übertragen, für die normalerweise Formatkonvertierungen erforderlich sind, die mit ftp / sftp / ... gesendet oder an eine E-Mail angehängt und gesendet werden.

Wir fanden den Edit-Compile-Debug-Zyklus reduziert. Wenn Sie Groovy zum Experimentieren verwenden, um Routen einzurichten, werden Boni hinzugefügt.

Spring-Integration ist auch ein großartiges Produkt, und ich bin mir ziemlich sicher, dass es auch unsere Bedürfnisse befriedigen würde.

Peter Tillemans
quelle
1
Vielen Dank an Peter für das Teilen Ihrer Punkte. Haben Sie jemals versucht, die JMS-Funktionen von Camel zu nutzen? Es scheint, dass die jeweiligen Komponenten auch sehr flexibel sind und den gleichen Reichtum wie Spring Integration haben. Mit "Small Scale Shootout" verweisen Sie auf bessere Leistungszahlen?
Ngeek
1
Shootout: Es war hauptsächlich Entwicklerleistung. Unsere Leistungsanforderungen sind nicht sehr hoch. Ja, wir verwenden viel JMS als Basis. Sowohl ActiveMQ als auch JBossMQ werden für Messaging verwendet.
Peter Tillemans
Können Sie einen Blick auf stackoverflow.com/questions/46930494/… werfen ?
gstackoverflow
67

Ich empfehle Spring Integration nur, wenn Sie bereits ein Spring-Projekt haben und nur eine "grundlegende" Integration mit Datei, FTP, JMS, JDBC usw. hinzufügen müssen.

Apache Camel hat zwei Hauptvorteile:

  1. Viele, viele weitere Technologien werden unterstützt.
  2. Neben einem (guten) XML-DSL gibt es fließende APIs für Java, Groovy und Scala.

Da Apache Camel sehr gut in Spring integriert ist, würde ich es in den meisten Spring-Projekten sogar anstelle von Spring Integration verwenden.

Wenn Sie weitere Informationen benötigen, können Sie meine Erfahrungen in meinem Blogbeitrag lesen: Die Qual der Wahl: Welches zu verwendende Integrationsframework - Spring Integration, Mule ESB oder Apache Camel?

Kai Wähner
quelle
31

Ich habe kürzlich ein Shootout von Camel vs Spring Integration durchgeführt, um Apache Kafka zu integrieren . Obwohl ich ein begeisterter Spring-Entwickler bin, stellte ich leider fest, dass mein Verdacht mit dem stetig wachsenden Project-Stack von Spring bestätigt wurde: Spring ist als IOC-Container großartig, um als Klebstoff für andere Frameworks zu dienen, bietet jedoch keine brauchbaren Alternativen zu diesen Frameworks . Es mag Ausnahmen geben, nämlich alles, was mit MVC zu tun hat, woher Spring stammt und wo es großartige Arbeit leistet, aber andere Versuche, neue Funktionen zusätzlich zu den Containerfunktionen bereitzustellen, scheitern aus drei Gründen, und der Anwendungsfall von SI Kafka bestätigt dies alle von ihnen:

  • Einführung eines langwierigen, schwer zu verwendenden DSL für die XML-Konfiguration.
  • Seiten mit XML-Konfigurationscode, um alle Framework-Komponenten zu verkabeln.
  • Fehlende Ressourcen, um Funktionen bereitzustellen, die mit dedizierten Frameworks vergleichbar sind.

Nun zurück zu den Ergebnissen meines Shoot-Outs: Vor allem beeindruckt mich das Gesamtkonzept von Camels für Routen zwischen Endpunkten . Kafka fügt sich nahtlos in dieses Konzept ein und drei Konfigurationslinien reichen aus, um alles zum Laufen zu bringen. Probleme, die während des Prozesses auftreten, werden durch eine ausführliche Dokumentation des Projektteams sowie viele Fragen zu Stackoverflow sauber behoben. Last but not least gibt es eine umfassende Integration in den Frühling , die keine Wünsche unerfüllt lässt.

Mit SI im Gegenteil, die Dokumentation für die Kafka-Integration ist ziemlich intensiv und erklärt immer noch nicht klar, wie Kafka integriert werden soll. Die Integration von Kafka wird in die SI-Arbeitsweise gedrängt , was die Komplexität erhöht. Andere Dokumentationen, z. B. zu Stackoverflow, sind ebenfalls weniger umfangreich und weniger hilfreich als für Camel.

Mein Fazit: Schuster bleiben bei Ihrem Handel - verwenden Sie Spring als Container und Camel als Systemintegrations-Framework.

Fritz Duchardt
quelle
3
Danke, Fritz, dass du deine Erfahrungen geteilt hast! Ich stimme Ihren Beobachtungen von ganzem Herzen zu: Camel ist in Bezug auf seine Grundkonzepte sehr sauber und bietet ein Ökosystem mit tragfähigen Komponenten für viele Aufgaben (bzw. ermöglicht eine einfache Anbindung, wenn Sie bestimmte Routinen anpassen möchten).
Ngeek
15

Es hängt wirklich davon ab, was Sie tun möchten. Wenn Sie etwas erweitern müssen, um Ihre eigene Messaging-Lösung zu erstellen, verfügt Spring Integration über das bessere Programmiermodell. Wenn Sie etwas benötigen, das viele Protokolle ohne benutzerdefinierten Code unterstützt, ist Camel Spring Integration voraus.

Eine kleine Schießerei ist eine sehr gute Idee. Stellen Sie nur sicher, dass Sie versuchen, die Art von Dingen zu tun, die Sie normalerweise im Projekt tun würden.

- Haftungsausschluss: Ich bin ein Spring Integration Committer

iwein
quelle
9

Die meisten Vergleiche von Camel und SI, die ich gesehen habe, berücksichtigen Folgendes nicht:

1.) Die Auswirkung von Spring Boot auf die Entwicklerproduktivität für Spring Integration

2.) Die Auswirkung von Spring XD auf die Bereitstellung von Spring Integration-Anwendungen ohne Codekompilierung - auch Spring XD-Quellen und -Senken sind einfach Spring Integration-Kanaladapter, wenn Sie Spring XD erweitern möchten.

3.) Spring XD hat dazu geführt, dass Spring Integration, Spring Batch, Spring Data (+ Hadoop!) In einem Stapel vereinheitlicht wurden, wodurch die Stapel- und Stream-Verarbeitung, die Unterstützung von HDFS / Apache Hadoop und vieles mehr effektiv in Spring Integration integriert wurden.

4.) Die Auswirkungen des in Kürze veröffentlichten Spring Integration 4.0 Java DSL https://github.com/spring-projects/spring-integration-extensions/wiki/Spring-Integration-Java-DSL-Reference

Für Ihre Überlegung,

/ Pieter (Haftungsausschluss Ich arbeite bei Pivotal)

PivotalPieter
quelle
3
Java DSL erfordert viel Arbeit und noch mehr Dokumentation, bevor es berücksichtigt werden sollte.
Cuttcards
Es ist jetzt für eine Weile veröffentlicht ... spring.io/blog/2014/11/24/…
Peter Szanto
6

Wir verwenden Spring Integration für unsere Anwendung und erwägen nun, auf Apache Camel umzusteigen, da wir viele Probleme mit dem Spring Integration Framework hatten. Hier sind einige Probleme.

  1. Die von Spring bereitgestellte CachingConnectionFactory öffnet Tausende von Leerlaufverbindungen in IBM MQ, und es gibt keine Garantie dafür, dass diese Verbindungen wiederverwendet werden. Und dennoch bleiben diese Verbindungen für immer offen, was zu Problemen auf der MQ-Seite führt. Musste die Anwendung jede Woche in niedrigeren Umgebungen neu starten, nur um die Verbindungen zu aktualisieren. Apache Camel bietet auch Caching und die Verbindungen scheinen je nach Auslastung hoch / runter zu gehen.

  2. Spring bietet keine Mapper für QoS-Parameter. Selbst wenn Sie QoS aktivieren, gehen der Übermittlungsmodus und die Ablauf- / Zeitplan-Eigenschaften verloren (ich werde hierfür ein JIRA-Problem ansprechen). Apache Camel übernimmt dies und QoS-Parameter werden an Upstream-Anwendungen gesendet und nicht gelöscht.

Ich arbeite gerade an Problemen mit der Behandlung der Ausnahmen und Transaktionen mit Apache Camel, die Spring mit AOP besser zu behandeln schien.

Selvakumar
quelle
Gab es eine Fehlkonfiguration, die zu offenen Leerlaufverbindungen in IBM MQ führte?
Harpreet Sandhu - TheRootCoder
4

Eigentlich würde ich sagen, dass FTP seine Inkubationszeit abgeschlossen hat. Sie können eine einfache Suche in SI-Foren / JIRA durchführen, um festzustellen, welche neuen Funktionen implementiert wurden und welche Fehler behoben wurden. Aus verschiedenen Gesprächen geht hervor, dass es bereits eine gewisse Produktionsnutzung gibt. Ich würde daher empfehlen, einen zweiten Blick darauf zu werfen und uns Ihre Bedenken natürlich über mitzuteilen

http://forum.springsource.org/forumdisplay.php?42-Integration
https://jira.springsource.org/browse/INT

Prost Oleg

Haftungsausschluss: Ich bin Spring Integration Committer

Oleg Zhurakousky
quelle
4

Apache Camel ist ein sehr guter Rahmen und auch sehr vollständig. Wenn Ihre Anwendung jedoch Spring verwendet, ist mein persönlicher Rat, Spring Integration zu verwenden.

Spring Integration ist das Integrations-EIP-Beschwerde-Framework des Spring-Source-Ökosystems. Es ist hervorragend in das Ökosystem integriert: Spring Boot, Batch, XD; Sogar der Kern verwendet dieselbe Abstraktion ab Spring Framework 4. Ein Teil der Messaging-Abstraktion wurde in das Framework verschoben, um zu beweisen, dass die grundlegende Messaging-Abstraktion von Spring Integration sehr stark ist. Jetzt verwendet das Spring Framework beispielsweise die Messaging-Abstraktion für Spring Web, die Unterstützung für Web-Sockets.

Eine weitere gute Sache in einer Spring-Anwendung mit Spring-Integration in Bezug auf die Verwendung von Apache Camel ist, dass Sie mit der Spring-Integration nur einen Anwendungskontext verwenden können. Denken Sie daran, dass der Kamelkontext ein Frühlingskontext ist. Wenn Sie die Möglichkeit haben, eine neue Spring-Version zu verwenden, empfehle ich, Spring Integration Java DSL für die Konfiguration zu verwenden. Ich verwende es für meine neuen Projekte und es fühlt sich lesbarer und klarer an. Ich hoffe, dass diese Überlegung Ihnen bei Ihren Bewertungen helfen kann.

Valerio Vaudi
quelle
1

Ein Grund für die Verwendung von Camel over Spring Integration ist, wenn Sie ein leistungsfähigeres EIP-Set benötigen. Spring Integration bietet keine Abstraktionen über Dinge wie ThreadPool.

Camel bietet zusätzliche Konstrukte, um einige Aspekte der Arbeit mit gleichzeitigem Code zu vereinfachen:

http://camel.apache.org/camel-23-threadpool-configuration.html

Wenn Sie so etwas nicht benötigen und nur Dateien, JMS, FTP-Endpunkte usw. verbinden möchten, verwenden Sie einfach Spring Integration.

Jon
quelle
2
Sie haben eine Abstraktion über ThreadPools selbst in SI-Pollern und Task-Executoren von Spring. In SI ist jedoch nichts für Sie OOTB vorkonfiguriert. Siehe den hier konfigurierten Task-Executor: static.springsource.org/spring-integration/docs/2.1.x/reference/…
cwash
@ Jon, können Sie bitte einen Blick auf meinen Beitrag auf JMS
Lerner
-1

Camel fungiert als Middleware für Anwendungen, in denen Datenmodellierung, Transformation von Nachrichtenwerten und Choreografie von Nachrichten durchgeführt werden können.

Sudhirkondle
quelle
-3

Wenn sich Ihre aktuelle Anwendung in Spring befindet und Funktionen erfordert, die von Spring Integration of EIP unterstützt werden, ist Spring Integration die beste Option. Andernfalls sind weitere Unterstützungen / Protokolle / Dateiformate usw. von Drittanbietern erforderlich

Venkata Parvatam
quelle
Camel hat wirklich eine großartige Unterstützung für Spring und deckt viele Komponenten von Drittanbietern ab.
MikeHoss