Wykluczanie odbiorców zdarzeń
Jeśli klient zastosuje zmianę optymistycznie, zanim Twój serwer ją opublikuje, odebranie tego samego zdarzenia może zastosować zmianę dwukrotnie. Może to spowodować migotanie lub zduplikowany element.
Przekaż identyfikator połączenia działającego klienta, aby dostarczyć zdarzenie do każdego innego subskrybowanego połączenia.
await bird.realtime.publish(appId, {
event: "message.created",
channels: ["presence-room-1"],
data: { body: "hello" },
exclude_connection_id: "26896.319537",
});client.realtime.publish(
app_id,
event="message.created",
channels=["presence-room-1"],
data={"body": "hello"},
exclude_connection_id="26896.319537",
)_, err := client.Realtime.Publish(context.Background(), appID, bird.RealtimePublishParams{
Event: "message.created",
Channels: []string{"presence-room-1"},
Data: map[string]any{"body": "hello"},
ExcludeConnectionID: "26896.319537",
})$bird->realtime->publish($appId, (new RealtimePublish())
->setEvent('message.created')
->setChannels(['presence-room-1'])
->setData(['body' => 'hello'])
->setExcludeConnectionId('26896.319537'));Pobierz identyfikator połączenia
Klient odczytuje swój identyfikator połączenia i wysyła go wraz z żądaniem, które wyzwala zmianę:
const bird = new BirdRealtime({ appKey: "your-app-key", region: "us1" });
await fetch("/messages", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
body: "hello",
connection_id: bird.connection.connectionId,
}),
});let bird = BirdRealtime(options: .init(appKey: "your-app-key", region: "us1"))
var request = URLRequest(url: URL(string: "https://your-backend.example.com/messages")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "content-type")
request.httpBody = try JSONSerialization.data(withJSONObject: [
"body": "hello",
"connection_id": bird.connectionId ?? "",
])
_ = try await URLSession.shared.data(for: request)val bird = BirdRealtime(BirdRealtimeOptions(appKey = "your-app-key", region = "us1"))
// Send the client ID with the HTTP client your app already uses.
api.postMessage(body = "hello", connectionId = bird.connectionId)Identyfikator ma wartość null, dopóki połączenie nie zostanie nawiązane, i zmienia się po ponownym połączeniu. Odczytaj bird.connection.connectionId w przeglądarce lub bird.connectionId w Swift i Kotlin w momencie wysyłania żądania.
Przekaż wartość do exclude_connection_id po zwalidowaniu jej jako niezaufanych danych żądania. To pole może wstrzymać dostarczanie do jednego połączenia, ale nie może przyznać dostępu do zdarzenia.
Zachowanie wykluczonego połączenia
Tylko wskazane połączenie jest wykluczane. Inne karty tej samej osoby korzystają z oddzielnych połączeń i nadal otrzymują zdarzenie.
Wykluczenie identyfikatora połączenia, które nie jest subskrybowane lub już nie istnieje, nie jest błędem. Publikacja jest dostarczana normalnie do wszystkich pozostałych.
Kiedy pominąć wykluczanie
Używaj wykluczania w optymistycznych interfejsach. Jeśli klient czeka na zdarzenie przed zastosowaniem zmiany, nie wykluczaj go. W przeciwnym razie działająca karta pozostanie nieaktualna.
Następne kroki
- Publikowanie zdarzeń opisuje resztę ładunku publikacji, w tym grupowanie i rozgłaszanie.
- Kanały obecności wyjaśniają, dlaczego jeden członek może mieć kilka połączeń.
- Opublikuj zdarzenie to pełna dokumentacja referencyjna żądania.
Powiązane zasoby
Przejdź do dokumentacji, przewodników i przykładów dotyczących tego tematu.