August 20, 2025

Nachrichten flexibel verteilen

symolo dmb server

Weiterlesen
Juli 6, 2023

Node js und der fetch

IpV4 vs IPV6

Weiterlesen
Juli 27, 2021

Mit Node.js gegen den Rest der Welt

Heute: easy SFTP Upload

Weiterlesen
Januar 26, 2021

Mit Node.js gegen den Rest der Welt

Heute: schnell mal was zippen

Weiterlesen
Cover Image

Nachrichten flexibel verteilen

symolo dmb server

August 20, 2025 - Lesezeit: 5 Minuten

Das Problem mit klassischer Nachrichtenverteilung

Wer schon einmal Systeme gebaut hat, bei denen viele Clients gleichzeitig Nachrichten empfangen und verarbeiten sollen, kennt das Problem: Wie verteile ich Messages effizient, ohne dass ein zentraler Server jede Nachricht individuell zustellen muss? Oft wird dabei auf klassische Message-Broker wie Kafka, RabbitMQ oder MQTT gesetzt. Diese bringen aber ihre eigene Komplexität mit – Setup, Konfiguration, Rechte- und Themenverwaltung. Für viele Szenarien, in denen man einfach nur schnell und flexibel Daten „in die Runde werfen“ möchte, sind solche Schwergewichte schlicht überdimensioniert.

Genau hier setzt der dynamic messaging broadcast server von Symolo an: Ein einfacher Ansatz, Nachrichten über TCP-Sockets (genauer gesagt WebSockets) an viele Teilnehmer gleichzeitig zu verteilen.

Besonderheit: TCP statt UDP-Broadcast

Ein wichtiger Unterschied zu klassischen Broadcast-Mechanismen liegt in der Wahl des Protokolls: TCP. Während UDP-Broadcasts nur innerhalb eines lokalen Netzwerks funktionieren – also typischerweise nicht über Routergrenzen hinweg –, ermöglicht TCP die Kommunikation über das Internet hinweg.

Das bedeutet:

  • UDP-Broadcast ist auf ein Subnetz beschränkt (praktisch für lokale Service Discovery, aber nicht für weltweite Kommunikation).
  • TCP hingegen stellt eine zuverlässige, verbindungsorientierte Kommunikation sicher – und funktioniert genauso gut innerhalb eines LANs wie zwischen Clients auf verschiedenen Kontinenten.

Dadurch ist es möglich, dass sich beliebige Teilnehmer – unabhängig von ihrem Standort – in die Nachrichten-Pipeline „reinhängen“ und sofort Teil des Systems werden.

Integration in den Symolo DSF-Server

Ein weiterer Vorteil: Das Tool ist bereits fester Bestandteil des Symolo DSF-Servers. Das bedeutet, bei jeder Installation des DSF-Servers steht die Nachrichten-Pipeline sofort zur Verfügung – ohne zusätzlichen Setup-Aufwand oder externe Abhängigkeiten. Entwickler und Administratoren müssen nichts weiter konfigurieren, sondern können direkt nach der Installation Clients anbinden, Filter setzen und Nachrichten verteilen. Damit wird die Funktion nahtlos in bestehende Symolo-Workflows integriert und ist „out of the box“ einsatzbereit.

Wie funktioniert das?

Die Grundidee ist simpel:

  • Jeder Client verbindet sich über einen WebSocket mit dem Server.
  • Nach der Authentifizierung „hört“ er auf die Nachrichten, die in die „Pipe“ eingespeist werden.
  • Jede Nachricht (außer Befehle, die mit / beginnen) wird an alle Clients verteilt.
  • Die Clients selbst entscheiden dann mithilfe von Filtern, ob sie eine Nachricht weiterverarbeiten wollen oder nicht.

Das Besondere: Jeder, der verbunden ist, kann nicht nur empfangen, sondern auch senden. Dadurch entsteht ein sehr flexibles Kommunikationsmodell, das sowohl für Debugging, Event-Streaming als auch für kollaborative Anwendungen nützlich ist.

Konkretes Beispiel

Sehen wir uns an, wie ein Client aussieht, der sich mit dem Symolo-Server verbindet:

const dmbLogger = new WebSocket("wss://<MEINSERVER>/dmb");

dmbLogger.onopen = () => {
    dmbLogger.send("123"); // Erst Authentifizierung mit Passwort
};

dmbLogger.onmessage = (d) => {
    // Nach erfolgreicher Authentifizierung
    if (d.data === "Welcome") {
        // Filter setzen – in diesem Fall nur Nachrichten, die mit "MDE" beginnen
        dmbLogger.send("/filter.add>MEINFILTER");
    }
    // Ab jetzt kommen gefilterte Nachrichten an
    if (d.data.startsWith("MEINFILTER")) {
        const msgSplit = d.data.split('|');
        console.log("Gefilterte Nachricht:", msgSplit);
    }
};

Was passiert hier?

  1. Verbindung & Authentifizierung Der Client verbindet sich mit wss://<MEINSERVER>/dmb und sendet als Erstes ein Passwort.

  2. Willkommensnachricht Der Server bestätigt den erfolgreichen Login mit "Welcome".

  3. Filter setzen Anschließend legt der Client fest, welche Nachrichten er empfangen möchte (z. B. /filter.add>MDE).

  4. Nachrichten empfangen & verarbeiten Alle Nachrichten, die mit MEINFILTER beginnen, landen nun im Client, werden geparst und können beliebig weiterverarbeitet werden.

Fazit

Mit diesem Ansatz gelingt es Symolo, ein leichtgewichtiges, flexibles Nachrichtenverteilungssystem bereitzustellen, das ganz ohne schwerfällige Broker-Lösungen auskommt. Jeder Client kann gleichzeitig Sender und Empfänger sein, und durch die Filterlogik bleibt die Datenflut dennoch kontrollierbar.

Besonders spannend ist der Einsatz von TCP statt UDP-Broadcast: Nachrichten können nicht nur im lokalen Netz, sondern auch problemlos über das Internet verteilt werden – ohne auf spezielle Netzwerk-Setups angewiesen zu sein.

Ob für Debugging, Monitoring oder den schnellen Aufbau von Echtzeitkommunikation – dieses Modell zeigt, wie einfach Messaging über TCP-Sockets sein kann.


Cover Image

Node js und der fetch

IpV4 vs IPV6

Juli 6, 2023 - Lesezeit: ~1 Minute

Wenn man in Node JS schnell mal nen fetch absetzten will und der dann auf einen lokalen Server geht, kann man ja schnell mal Localhost einsetzen. Das ist aber tricky, wenn der Server nur auf IPV4 hört, da NodeJS dann versucht über IPV6 zu verbinden.

Einfache Lösung: 0.0.0.0 eintragen, dann nimmt NodeJS auch die IPV4 Adresse. Nett.


Cover Image

Mit Node.js gegen den Rest der Welt

Heute: easy SFTP Upload

Juli 27, 2021 - Lesezeit: 14 Minuten

Immer mal wieder hat man die Anforderung schnell mal ein paar Dateien von einem Rechner auf einen anderen zu laden. Besonders wenn dann noch das Internet beteiligt ist, ist man bestrebt das Ganze auch noch sicher ablaufen zu lassen. Damit entfällt die alte aber zuverlässige Methode des FTP. Aber dafür hat man ja SFTP. Nodejs macht es einem dann sogar recht einfach, da es bereits ein paar tolle Pakete dafür gibt. Eins davon hab ich dann heute mal eingesetzt und wieder lässt sich ein Anforderung in wenigen Zeilen elegant lösen. 

Installation

npm i sftp-upload

Danach eigentlich nur noch passend konfigurieren und fertig:

const SftpUpload = require('sftp-upload');

async function uploadFiles() {
  return new Promise((resolve=> {
    process.stdout.write('\r');
    new SftpUpload({
      host: '<HOST HERE>',
      username: '<USER HERE>',
      password: "<PASS HERE>",
      path: './',
      remoteDir: '/<DIR HERE>',
      excludedFolders: ['node_modules'],
      exclude: ['package-lock.json''package.json'],
      dryRun: false
    })
      .on('error', (err=>  {throw err;} )
      .on('uploading',  (progress=>  process.stdout.write('\r' + progress.percent + '% completed'))
      .on('completed', () => {
        process.stdout.write('\r');
        resolve();
      })
      .upload();
  });
}

(async () => {
  await uploadFiles();
  console.log("DONE");
})();

Lässt sich super für Kontinuierliche Integration einsetzen und man könnte das ganze jetzt mit dem Komprimieren passend kombinieren. Jetzt muss das Ganze nur noch zyklisch ausgeführt werden...


Cover Image

Mit Node.js gegen den Rest der Welt

Heute: schnell mal was zippen

Januar 26, 2021 - Lesezeit: 6 Minuten

Wenn man mehrere Dateien transportieren will ist es meistens einfacher die Dateien in einer Datei zusammenzufassen. Dazu kann man die Dateien einfache in ein komprimiertes Archiv stecken. Eigentlich ist die Komprimierung dafür gedacht, die Dateigröße auf ein Minimum zu reduzieren und so Speicherplatz sparen zu können. Die Komprimierungsverfahren erzeugen aber Dateien, die erst wieder entpackt werden müssen um benutzt werden zu können. Das funktioniert sowohl bei Dateien wie auch ganzen Ordnern.

Es gibt Verfahren, bei denen wird vor der Ausführung der Datei ein eigenes Entpacken ausgeführt und dann wird die Datei gestartet. Sofern es sich um ein Programm handelt, ist das durchaus ein Möglichkeit. Dieses Verfahren ist in der Demo Szene sehr beliebt. Hier gibt es die Herausforderung möglichst viel Programmlogik in möglichst kleinen Dateien unterzubringen. Diese Verfahren sind sehr kompliziert und meist nur für den aktuellen Fall geeignet und machen teilweise von Systemlücken gebrauch, die unter Umständen vom Betriebssystemhersteller auch mal korrigiert werden, was dafür sorgt, dass im nächsten Moment ein entpacken nicht mehr möglich ist oder das Programm funktioniert nicht mehr korrekt. Jetzt gibt es aber auch Verfahren, die genormte Komprimierungs-technologien verwenden und keine Lücken nutzen, dafür nicht immer ganz so effektiv sind. Für unsere Anforderung ganze Verzeichnisse in einer Datei zu transportieren, fällt das aber nur gering ins Gewicht.

Jetzt kann man das Ganze von Hand manuell über Systemtools oder mithilfe vorhandener Software lösen. Hat man die Anforderung aber öfter, sagen wir mal man macht täglich Releases, dann darf der Vorgang gerne automatisiert werden. Das lässt sich in vielen Programmiersprachen sehr komfortabel erledigen. So auch in JavaScript und Node.js. Node.js stellt hierbei die Dateifunktionen und die Pakete und JavaScript macht das Ganze schön flexibel. Gerade wenn z.B. der Dateiname automatisch aus einem Datum erzeugt werden soll, macht einem JavaScript das Leben einfach.

Das Ganze in ein Skript gepackt könnte dann so aussehen:

const path = require('path');
const zipFolder = require('zip-folder'); // npm install zip-folder

// make some nice name
const filenameToUse = new Date().toLocaleString().replace(/\:/g'-');

(async () => {
  zipFolder(
    path.join(__dirname, 'FolderToZip'),
    path.join(__dirname, filenameToUse + '.zip'),
    (err) => {
      if (err) {
        console.log(`oh no! Error while create: ${filenameToUse} `, err);
      } else {
        console.log(`EXCELLENT: ${filenameToUse} created`);
      }
    })
})();

Das Ganze kann man z.B. ja auch noch mit einem ftp Upload kombinieren. Oder die Datei zum Beispiel danach noch zur Sicherung kopieren. So können hier einfach Schritte automatisiert werden und auch an andere Anforderung schnell und flexibel angepasst werden und das mit einem simplen Texteditor. Und und und...