Ich benutze Gin-Framework, um einen API-Server zu erstellen. Im Allgemeinen baue ich 2 Projekte. Projekt und Projekt 'SOCKET'
. Das Projekt 'API'
ist die wichtigste REST-API, die in Android verwendet wird und mit gin
Framework (Golang) entwickelt wurde. Und Projekt 'SOCKET'
ist der Socket-Server für Client, der Socket-Verbindung verwenden, mit node.js (Socket.IO
)Wie sicherzustellen, Redis Teilnehmer empfangen Nachricht in Go (Golang)?
Der Prozess beginnt wie folgt aus:
Benutzer A: als Anforderer; Eine Verbindung zu "API"
Benutzer B: als Responder; B Verbindung zu "SOCKET"
User A
Aufruf API requestData
von Android, die Anfrage von "API"
‚s Projekt behandelt wird. Und Projekt "API"
wird die Anfrage aufnehmen und veröffentlicht auf redis als new_request
mit PubSub
dies der Code zum Beispiel:
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
pong, err := client.Ping().Result()
fmt.Println(pong, err)
if err !=nil {
fmt.Println("err",err);
}
pubsub, err := client.Subscribe("responseclient")
if err !=nil {
panic(err)
}
defer pubsub.Close()
err = client.Publish("new_request", "Example New Request").Err()
if err !=nil {
panic(err)
}
msg, err :=pubsub.ReceiveMessage()
if err != nil {
panic(err)
}
fmt.Println(msg.Channel, msg.Payload)
}
Im Projekt "SOCKET"
gibt es einen Teilnehmer, der zuhört Jede Veröffentlichung, die aufgetreten ist, und veröffentlichen neue Nachricht auf Kanal responseclient
Dies ist für den Beispielcode:
ioApp.on ('connection' , function(socket) {
redisSub.on('new_request', function (channel, message) {
console.log(channel + ':' + message);
redisPub.publish("responseclient", JSON.stringify(res));
});
})
Diese Arbeit reibungslos, wenn Benutzer B zu Socket.IO Verbunden ist. Aber wenn Benutzer B offline war oder nicht verbunden ist Socket.io, dies wird für lange warten, bis wir manuell zu töten oder bis der Benutzer B ist online
Was ich für mich fragen, sind:
- Können wir etwas wie ein
callback
auf Redis Pub/Sub erstellen? Wenn der Teilnehmer die Nachricht nicht akzeptiert, aufgrund von Offline oder etwas anderem, schließen wir die Verbindung. Ist das möglich ? - In Node.Js weiß ich, ich kann Timeout-Funktion verwenden, die das Subskribieren schließen oder jedes Ereignis ausstrahlen wird, wenn zu einer bestimmten Zeit keine Nachricht empfangen wurde, wie dies auf Golang zu tun? Ich muss die
User A
informieren, wennUser B
aktiv oder offline ist, so dass er eine weitere Zeit warten kann, um eine Anfrage zu erstellen. - Wenn nichts kann, was ist dein Vorschlag für mich, dies zu tun?
Ich hoffe meine Frage, verständlich, und kann gut beantwortet werden.
* Einige Code möglicherweise, fehlende Variable.
** Ich verwende diese Bibliothek für Goland Redis: go-redis
Für die erste Frage ist die Antwort nein: http://stackoverflow.com/questions/23675394/redis-publish-subscribe-is-redis-guaranteed-to-deliver-the-message-even-under-m . Sehen Sie sich antirezs Kommentar für eine mögliche Lösung an –
Danke für die Antwort. Auf der Suche nach ACK vielleicht eine andere Lösung für mich. Weil ich auf die Antwort der zweiten Frage warte Hehe: D –