Sobes.tech
Senior

Jakie są cechy protokołu DDP?

sobes.tech AI

Odpowiedź od AI

DDP (Protokół Danych Rozproszonych) to protokół używany w Meteorze (frameworku do tworzenia aplikacji internetowych i mobilnych) do komunikacji między klientem a serwerem.

Główne cechy:

  • Publikacja/Subskrypcja: Serwer "publikuje" dane (kolekcje dokumentów), a klienci "subskrybują" interesujące ich publikacje. Gdy dane na serwerze się zmieniają, są one automatycznie wysyłane do wszystkich subskrybujących klientów.
  • W czasie rzeczywistym: Zmiany danych są przesyłane natychmiast, zapewniając aktualność informacji na kliencie.
  • Wywołania zdalne procedur (RPC): Klienci mogą wywoływać metody na serwerze, wykonując określone działania.
  • Idempotentność wywołań: Powtórne wywołanie tej samej metody z tymi samymi argumentami nie powoduje niepożądanych skutków ubocznych (dla większości standardowych metod).
  • Transport: Zazwyczaj używa się WebSocket do stałego dwukierunkowego połączenia, ale może fallbackować na HTTP.
  • Dane: Transmisja danych odbywa się w formacie JSON.
  • Wysyłanie danych tylko wtedy, gdy jest to konieczne: Serwer wysyła do klienta tylko te dane, na które subskrybuje, i tylko przy ich zmianie.
  • Praca offline: Meteor pozwala klientom tymczasowo zapisywać zmiany w danych lokalnie i synchronizować je z serwerem po przywróceniu połączenia.
// Przykład publikacji na serwerze (Node.js)
Meteor.publish('myCollection', function() {
  return MyCollection.find({}); // Publikuje wszystkie dokumenty z kolekcji
});

// Przykład subskrypcji na kliencie (JavaScript)
Meteor.subscribe('myCollection');
// Przykład wywołania metody na kliencie (JavaScript)
Meteor.call('addDocument', { name: 'Nowy dokument' }, function(error, result) {
  if (error) {
    console.error("Błąd podczas dodawania dokumentu:", error);
  } else {
    console.log("Dokument pomyślnie dodany:", result);
  }
});

// Przykład implementacji metody na serwerze (Node.js)
Meteor.methods({
  addDocument: function(doc) {
    // Walidacja i dodanie dokumentu
    return MyCollection.insert(doc);
  }
});