Top-Logic bietet die Möglichkeit Daten zwischen verschiedenen TL-Systemen zu synchronisieren. Hierfür werden Daten von dem Quellsystem an das externe Bus-System Kafka gegeben. Dieses verteilt dann die Daten an die Zielsysteme. Eine gute Einführung zu Kafka findet man in Kafka Tutorial. Mittels des Kafka Tools kann man Kafka-Instanzen untersuchen.
Der Ablauf bei der Synchronisation ist folgender:
com.top_logic.kafka nutzen.com.top_logic.kafka nutzen.com.top_logic.kafka.server enthält einen Kafka-Server und Launchkonfigurationen um Kafka zu starten.Welche Informationen aus dem Quellsystem TL1 exportiert werden, wird in der Modellkonfiguration festgelegt.
<exported /> gesetzt, so werden alle Instanzen dieses Types (und aller Subtypen #22251) exportiert.
<exported value="false"/> gesetzt werden.Bsp.:
<model xmlns="http://www.top-logic.com/ns/dynamic-types/6.0">
<modules>
<module name="tl1_module">
<types>
<class name="tl1_type">
<annotations>
<exported /> <!-- Sorgt dafür das tl1_type exportiert wird -->
</annotations>
<attributes>
<property name="prop1" /> <!-- Wird exportiert da tl1_type exportiert wird -->
<property name="prop2" >
<annotations>
<exported value="false"/> <!-- Sorgt dafür das prop2 nicht exportiert wird -->
</annotations>
</property>
....
</attributes>
</class>
</types>
</module>
</modules>
</model>
Welche Informationen in das Quellsystem TL2 importiert werden, wird in der Modellkonfiguration festgelegt.
<imported />) gesetzt, so werden Objekte dieses Types durch Importe angelegt, geändert und gelöscht.
<imported source="tl1_module:tl1_type" /> gesetzt. Kommt von dem Quellsystem ein Objekt mit dem Type "tl1_module:tl1_type" (im Quellsystem), so werden diese Änderung zu dem Zieltyp "tl2_module:tl2_type" umgeschlüsselt.<imported /> Annotation kein source angegeben, wird als Quelltyp ein Typ mit dem selben Modul- und Typnamen, wie im Zieltyp erwartet, d.h für einen Typ tl2_module:tl2_class wäre die Annotation <imported /> gleichbedeutend mit <imported source="tl2_module:tl2_class"/>.<imported source="bar"/> benutzt werden.Bsp.:
<model xmlns="http://www.top-logic.com/ns/dynamic-types/6.0">
<modules>
<module name="tl2_module">
<types>
<class name="tl2_type">
<annotations>
<imported source="tl1_module:tl1_class" /> <!-- Objekte vom Typ "tl1_module:tl1_class" werden auf "tl2_module:tl2_class" gemappt-->
</annotations>
<attributes>
<property name="prop1" /> <!-- Wird mit dem Attribut "tl1_module:tl1_class#prop1" identifiziert -->
<property name="myFunnyProp2" >
<annotations>
<imported source="prop2"/> <!-- Sorgt dafür das "tl2_module:tl2_class#myFunnyProp2" mit "tl1_module:tl1_class#prop2" identifiziert -->
</annotations>
</property>
....
</attributes>
</class>
</types>
</module>
</modules>
</model>
In der Standardkonfiguration überträgt Kafka nur Nachrichten bis 1 MB Größe. Dieses Limit kann zum Beispiel bei Gallery-Attributen oder anderen Datei-Uploads schnell erreicht werden. Sobald in der Standardkonfiguration eine Nachricht größer 1 MB übertragen werden soll, stoppt die TL-Sync-Übertragung dauerhaft, bis das Problem behoben wurde. Es gibt zwei Wege, dies zu vermeiden:
Um größere Nachrichten zu übertragen, müssen folgende Konfigurationen geändert werden:
message.max.bytescom.top_logic.kafka.server/webapp/WEB-INF/conf/kafka/server.propertiesRecordTooLargeException: The request included a message larger than the max message size the server will accept.ext.org.apache.kafka/config/server.properties die Einstellung: socket.request.max.bytescom.top_logic.kafka.server/webapp/WEB-INF/conf/kafka/server.properties die Einstellungen: socket.request.max.bytes und replica.fetch.max.bytesMittels Constraints muss die maximale Datenmenge an potentiell großen Attributen beschränkt werden. Dabei ist zu beachten, dass Dateien bei der Übertragung etwa die 1,4-fache Menge an Bytes benötigen. Ein Bild das 59 MB groß war, hat eine Kafka-Message der Größe 81 MB erzeugt. Das muss man bei den Constraints entsprechend beachten.