Я использую gin framework для создания сервера API. В целом, я строю 2 проекта. Проект 'API'
и проект 'SOCKET'
. Проект 'API'
является основным REST API, который будет использоваться в Android, разработанном с использованием рамки gin
(golang). И Project 'SOCKET'
является сокет-сервер для клиента, который будет использовать сокет-соединение, используя Node.js (Socket.IO
)Как обеспечить получение подписчиком подписчика redis в Go (Golang)?
Процесс начинаются так:
Пользователь A: как запрашивающей; A connect to "API"
Пользователь B: как ответчик; B подключается к "SOCKET"
User A
вызова API requestData
от андроида, то запрос будет обрабатываться "API"
«s проекта. И Project "API"
будет записывать запрос и опубликовать на Redis в new_request
с использованием PubSub
это код, например:
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)
}
В проекте "SOCKET"
есть абонент, который будет слушать каждая публикация, которая произошла, и опубликовать новое сообщение на канал responseclient
это код примера:
ioApp.on ('connection' , function(socket) {
redisSub.on('new_request', function (channel, message) {
console.log(channel + ':' + message);
redisPub.publish("responseclient", JSON.stringify(res));
});
})
Эта работа гладко, если пользователь B подключен к Socket.io. Но если Пользователь B был в автономном режиме, или не подключен к Socket.io, это будет долго ждать, пока мы не убить вручную или пока пользователь Б не онлайн
Что я прошу, являются:
- Можем ли мы создать что-то вроде
callback
на redis pub/sub? Если абонент не принимает сообщение, из-за линии или чего-то еще, мы закрываем соединение. Это возможно ? - В Node.Js я знаю, что могу использовать функцию таймаута, которая закроет подписку или испустит какое-либо событие, если в определенное время не было получено сообщение, как это сделать на golang? Мне нужно сообщить
User A
, еслиUser B
активен или находится в автономном режиме, поэтому он может подождать еще раз, чтобы создать запрос. - Если ничего не может, то каково ваше предложение для меня сделать это?
Надеюсь, мой вопрос, понятный и может хорошо ответить.
* Некоторый код может быть, отсутствует переменная.
** Я пользуюсь этой библиотекой для golang redis: go-redis
Для первого вопроса ответ: нет. Http://stackoverflow.com/questions/23675394/redis-publish-subscribe-is-redis-guaranteed-to-deliver-the-message-even-under-m , Посмотрите комментарий Antirez для возможного решения. –
Спасибо за ответ. Ищите ACK, возможно, другое решение для меня. Потому что я жду ответа второго вопроса Хехе: D –