August 20, 2025

Nachrichten flexibel verteilen

symolo dmb server

Weiterlesen
Juli 18, 2025

Der letzte Commit

j.reimann – active

Weiterlesen
April 30, 2024

Sortiert bleiben

Sortierverfahren

Weiterlesen
November 6, 2023

Text To Hex

Hex Hex

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

Der letzte Commit

j.reimann – active

Juli 18, 2025 - Lesezeit: 2 Minuten

Jan saß allein im Büro, umgeben von Bildschirmen, die schwach im Neonlicht glühten. Der Rest des Teams war längst gegangen – Freitagabend, Bier im Hof, Lachen auf den Gängen. Jan blieb. Nicht aus Pflichtgefühl, sondern weil er es nicht mehr schaffte, abzuschalten. Seit Monaten ging das so: Feature, Bugfix, Deployment, wieder von vorn. Die Deadlines rückten immer näher, als ob jemand sie absichtlich verschob, nur um zu sehen, wie weit man einen Menschen treiben kann, bevor er knackt.

Er hatte das Coden einst geliebt – die Logik, die Klarheit. Aber jetzt war es nur noch Druck. Jeder Task ein potenzieller Grund für Ärger, jedes Meeting ein Kampf ums Atmen. Seine Chefin sprach in OKRs und KPI-Zahlen, aber nie über Menschen. Jan hatte kaum noch Kontakt zu Freunden, sein Telefon blieb stumm. Wenn er es klingeln hörte, erschrak er. Schlaf fand er selten. Meist lag er starr im Bett, die Augen offen, die Gedanken rasend wie ein kaputtes Skript in Endlosschleife.

An diesem Abend starrte er auf einen Fehler, den er nicht verstand. Irgendwas mit dem Cache, irgendwas mit ihm. Die Luft roch nach Plastik und abgestandenem Kaffee. Seine Stirn lag auf der Tischkante. Die Hände hingen schlaff über der Tastatur. Er war müde, zu müde, um noch Angst zu haben. Als die Uhr 3:12 zeigte, öffnete er das Fenster, ließ die Nachtluft herein und schloss dann leise seinen Laptop. Zum ersten Mal seit Wochen.

Am nächsten Morgen fand ihn der Hausmeister. Jan saß noch da, die Stirn auf dem Tisch, die Augen geschlossen, als hätte er nur geschlafen. Sein Herz hatte einfach aufgehört. Ein Arzt sagte später, sowas könne passieren, wenn Stress zu lange ignoriert wird. "Burnout" stand im Firmenmemo. Die Chefin nannte es "eine tragische Verkettung persönlicher Umstände". In der Firma gab es ab da einen Obstkorb und eine “Mental Health Awareness Week”.

Sein Platz blieb noch wochenlang leer. Irgendwann setzte sich ein Neuer dorthin, junger Typ, ehrgeizig, Laptop voller Sticker. Keiner sprach mehr über Jan. Aber manchmal, wenn es still war im Büro, hörte man ein leises Klacken von Tasten, obwohl niemand tippte. Und auf dem Monitor in der Ecke tauchte für Sekunden ein alter Username auf: j.reimann – active. Dann verschwand er wieder.


Cover Image

Sortiert bleiben

Sortierverfahren

April 30, 2024 - Lesezeit: 3 Minuten

Es gibt ein ganze Menge verschiedener Sortierverfahren, die man benutzen kann um etwas Ordnung in das Chaos zu bekommen. Jedes Verfahren hat bei vor und Nachteile.Wenn man in Javascript nicht selber sortiert, sondern das dem Browser überlässt ist es natürlich irrelevant, welches Verfahren tatsächlich verwendet wird. Trotzdem kann das beschäftigen mit diesen Verfahren neue Denkanstöße liefern.

Der Bubble Sort

Bei diesem Verfahren "blubbern" die Werte einfach nach oben. Das Verfahren ist langsam und eignet sich nur bedingt für große Mengen. Aber es ist einfach zu verstehen und genauso einfach zu implementieren.

Laden...

Der Selection Sort

Dieses Verfahren "selektiert" die zu sortierenen Einträge vorher und ist daher effizienter als Bubble Sort.

Laden...

Der Insertion Sort

Bei diesem Verfahren werden die Einträge an der richtigen Stelle einsortiert. Es eignet sich am besten für vorsortierte Werte, bei denen ein neuer Wert an die passende Stelle hinzugefügt werden soll.

Laden...

Der Quick Sort

Der Quicksort teilt die Arbeit in kleine Teilabschnitte auf und muss nicht erneut bereits sortierte Abschnitte prüfen. In dem Beispiel habe ich mehr Werte genommen, da ansonsten die ganze Power den Verfahrens nicht richtig sichtbar wird.

Laden...


Cover Image

Text To Hex

Hex Hex

November 6, 2023 - Lesezeit: 14 Minuten

Manchmal kann es sinnvoll sein, sich Text in Hex anzeigen zu lassen. Besonders bevor man mit ihm weiterarbeitet, da es wirklich vorkommen kann, dass intern mit anderen Werten gearbeitet wird und diese Info dann im weiteren Verlauf fort ist, was zu Problemen führen kann. Dafür hab ich mal ne Funktion geschrieben:

function utf8ToHex(str) {
return Array.from(str).map(c =>
c.charCodeAt(0) < 128 ? c.charCodeAt(0).toString(16) :
encodeURIComponent(c).replace(/\%/g,'').toLowerCase()
).join('-');
}

Mithilfe dieser Funktion kann man einen String leicht analysieren. So geschehen mit folgender Funktion:

utf8ToHex(new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
}).format(20))

Das Ergebnis war sehr intressant:

32-30-2c-30-30-c2a0-e282ac

An der Stelle, wo ich ein Leerzeichen "20" vermutete war ein "c2a0". Sieht man beim Ausgeben nicht und ist beim Kopieren weg. Folgende Funktion funktionierte dann nicht wie gewünscht:

new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
}).format(20).match(new RegExp("0 €", 'gi'))

-> null

Ich erwartete, dass das geht. Weil ich ja nur ein Leerzeichen gesehen habe. Da war aber ein NOBREAK.

So geht es jetzt:

new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
}).format(20).replace('\xa0',' ').match(new RegExp('0 €','gi'))

2 Stunden testen und suchen, nur weil ich es nicht gesehen haben und es beim Kopieren verloren gegangen ist...