Posts

NoSQL Key-Value-Stores unterstützen oft nur get, put und delete Operationen auf einen Primärschlüssel. Document-Stores ähneln den Key-Value-Stores, speichern aber den Value in einem Format. Bei MongoDb ist es ein JSON-Format. Es kann dann zusätzlich auf die Informationen im Document gefiltert werden oder sogar nur ein Teil des Documents zurückgegeben werden. Transaktionen sind in der Regel pro Document, können je nach Datenbank aber auch mehrere Documents umfassen. Ein wesentlicher Unterschied von allen NoSQL Datenbanken zu den relationalen Datenbanken ist die Transaktionssicherheit.

WEITERLESEN

Ein Bloom-Filter kann man einsetzen, wenn schnell überprüfbar sein muss, ob ein Wert nicht vorhanden ist. Man kann zum Beispiel verschiedene Wörter im Bloom-Filter speichern und schnell überprüfen, ob die Eingabe einem Wort im Filter entspricht. Der Vorteil vom Bloom-Filter ist der geringe Speicherplatz und die Geschwindigkeit. Ein Nachteil ist, dass man mithilfe des Bloom-Filters nicht sagen kann, ob der Wert vorhanden ist.

WEITERLESEN

Mittlerweile gibt es einige verteile Systeme. Die Blockchain-Technologien sind nur die Neusten. Es gibt zum Beispiel noch:

  • Verteiltes Filesystem (z.B. Hadoop, NFS, CIFS, AFP)
  • Peer to Peer Video-Plattform (z.B. PeerTube)
  • Federated Kurznachrichtendienst (z.B. Mastodon)
  • Email
  • Internet (Webserver)
  • DNS
  • Distributed Hash Tables (z.B. Kademlia, Chord, TomP2P, Paxos, Raft)
  • BitTorrent
  • Software Updates in Windows 10 und einigen Spielen
  • Browser Peer to Peer über WebRTC (Videotelefonie, Chat u.v.m.)
  • Remote Procedure Call (RPC) (z.B. gRPC, Apache Avro)
  • Peer to Peer Internet (z.B. Tor)
  • Message Queue (z.B. RabbitMQ, ActiveMQ, Qpid, ZeroMQ, Kafka)
  • Hierarchical key-value-store (z.B. Apache ZooKeeper)

Ich werde einige als Prüfungsvorbereitung beschreiben. Viel Material kann man auf der Website von Maarten van Steen finden.

WEITERLESEN

Sinn und Zweck

Die Threads selbst zu verwalten ist nicht immer nötig und für kleinere Aufgaben auch oft zu teuer. Es gibt in Java den so genannten Thread Pool, dem man Aufgaben übergeben kann. Diese Aufgaben werden ausgeführt und man erhält sofort einen Future<Ergebnis> zurück. Dieser Future enthält dann irgendwann das Ergebnis der Aufgabe oder “null”, falls kein Ergebnis gewünscht wurde.

WEITERLESEN

Sinn und Zweck der Synchronisation

Wenn mehrere Prozesse beispielsweise eine Variable lesen und schreiben, können durch unterschiedliches Timing falsche Zustände entstehen. Am Einfachsten kann man es sich mit einem Bankkonto veranschaulichen. Ein Thread erhöht jeweils den Kontostand um 10 und ein anderer Thread reduziert den Kontostand um 10. Damit man den Kontostand um 10 verändern kann, muss man den Kontostand natürlich zuerst wissen. Es könnte also zum Beispiel folgendes passieren:

  • Thread 1 liest Kontostand (0)
  • Thread 2 liest Kontostand (0)
  • Thread 2 erhöht Kontostand (10)
  • Thread 1 reduziert Kontostand (-10)

Der obige Ablauf ist möglich, weil das Betriebssystem entscheidet, wann und wie lange ein Thread laufen darf. Wenn nur eine fehlerhaften Reihenfolge möglich ist, kann es zu Fehlern kommen, aber leider nicht bei jeder Programmdurchführung. Das macht das Testen und das Debuggen schwer.

WEITERLESEN

Begriffe

Race Condition gibt es sobald man den Zugriff auf gemeinsame Ressourcen (Variablen oder ähnliches) nicht genügend synchronisiert. Anders ausgedrückt hat man eine Race Condition, wenn die Ausführung nicht immer zu einem gültigen Zustand kommt. Man könnte auch sagen, dass aufgrund der Race-Condition je nach Thread-Scheduling andere Ergebnisse bei gleichem Code generiert werden.

Deadlocks sind Situationen, in denen sich Threads gegenseitig blockieren. Das kann beispielsweise passieren, wenn Locks in unterschiedlichen Reihenfolgen akquiriert wurden und dabei je ein Thread das Lock vom anderen Thread benötigt, bevor er fortfahren kann.

WEITERLESEN

Übersicht

In Java gibt es einige Möglichkeiten zur Synchronisation. Den Monitor-Lock mit dem synchronized keyword ist nur eine davon.

  • Semaphor
  • Lock & Condition
  • Read-Write Lock
  • CountDownLatch
  • CyclicBarrier
  • Exchanger

WEITERLESEN

In dieser Artikelreihe werde ich versuchen die Parallelität und die Nebenläufigkeit anhand der Programmiersprache Java zu beschreiben.

Begriffe

Parallelität (Parallelism) hat zum Ziel, dass das Programm schneller fertig ist. Zum Beispiel kann man einen Ablauf in mehrere Teilabläufe aufteilen, damit die Teile dann auf verschiedenen Prozessen laufen können.

Nebenläufigkeit (Concurrency) hat nicht unbedingt ein schnelleres Programm zum Ziel, sondern Abläufe verzahnt durchführen können. Beispielsweise können Abläufe gleichzeitig auf gemeinsame Ressourcen lesend zugreifen oder gesperrt werden, wenn einer schreiben muss.

Es gilt jedoch, dass immer mehrere Threads interagieren.

WEITERLESEN

Für eine Präsentation habe ich untenstehende Folien erstellt. Die Präsentation ist ausserdem mit meinen Anmerkungen versehen. Link zur Präsentation

WEITERLESEN