Podczas projektowania skalowalnych aplikacji wielowątkowych i rozproszonych stosuje się wzorce, które zapewniają bezpieczeństwo podczas równoległego dostępu oraz efektywną interakcję między komponentami.
Wzorzec "Aktor" — to model, w którym każda jednostka (aktor) enkapsuluje stan i komunikuje się z innymi tylko za pomocą asynchronicznych wiadomości. Wyklucza to wyścigi wątków, ponieważ aktor samodzielnie przetwarza przychodzące wiadomości w kolejności.
Wzorzec "Kolejka wiadomości" — to rozwiązanie architektoniczne, w którym poszczególne komponenty wysyłają dane do kolejki wiadomości, skąd są one pobierane przez wykonawców. Zapewnia to buforowanie zadań, rozdzielenie prędkości nadawcy i wykonawcy oraz odporność na przeciążenia.
Przykład „Aktorów” w Scala (Akka):
class SimpleActor extends Actor { def receive = { case "ping" => sender() ! "pong" } }
Przykład kolejki wiadomości w Pythonie (RabbitMQ/Pika):
import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='tasks') channel.basic_publish(exchange='', routing_key='tasks', body='Hello')
Kluczowe cechy:
Czy można przekazywać wspólne obiekty stanu (Shared State) między aktorami?
Nie, aktorzy nie powinni dzielić stanu. Komunikują się tylko wiadomościami, w przeciwnym razie traci się zaletę izolacji i pojawia się ryzyko wyścigów danych.
Czy kolejka wiadomości gwarantuje kolejność dostawy dla wszystkich subskrybentów?
Nie, gwarantowana jest tylko kolejność wewnątrz jednej kolejki dla jednego konsumenta. Przy skalowaniu (wielu konsumentów) kolejność nie jest gwarantowana między odbiorcami.
Czy aktorzy i kolejki wiadomości są sobie nawzajem konkurencyjni?
Nie, często są łączone: aktorzy dla logiki wewnętrznej (np. w obrębie węzła), a kolejki wiadomości — do wymiany zadań między usługami lub maszynami.