Я использую структуру gin для создания сервера API. В общем, строю 2 проекта. Проект 'API'
и Проект 'SOCKET'
. Project 'API'
- это основной REST API, который будет использоваться в Android, разработанный с использованием gin
framework (golang). И Project 'SOCKET'
- это сервер сокетов для клиента, который будет использовать соединение через сокет, используя node.js (Socket.IO
).
Процесс начинается следующим образом:
Пользователь A: в качестве инициатора запроса; A подключиться к "API"
Пользователь B: в качестве ответчика; B подключиться к "SOCKET"
User A
вызвать API requestData
из Android, запрос будет обработан проектом "API"
. Проект "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)
}
В Project "SOCKET"
есть подписчик, который будет прослушивать каждую происходящую публикацию и публиковать новое сообщение на канале responseclient
. Это пример кода:
ioApp.on ('connection' , function(socket) {
redisSub.on('new_request', function (channel, message) {
console.log(channel + ':' + message);
redisPub.publish("responseclient", JSON.stringify(res));
});
})
Это работает нормально, если Пользователь Б подключен к Socket.IO. Но если Пользователь Б был в автономном режиме или не был подключен к socket.io, это будет ждать долго, пока мы не убьем вручную или пока пользователь Б не будет в сети.
Я прошу:
- Можем ли мы создать что-то вроде
callback
на redis pub / sub? Если подписчик не принимает сообщение из-за оффлайн или чего-то еще, мы закрываем соединение. Это возможно ? - В Node.Js я знаю, что могу использовать функцию тайм-аута, которая закроет подписку или выдаст какое-либо событие, если в определенное время не было получено сообщение, как это сделать на golang? Мне нужно сообщить
User A
, активен лиUser B
или нет, чтобы он мог подождать еще раз для создания запроса. - Если ничего не может, что вы мне посоветуете сделать?
Надеюсь, мой вопрос понятен и на него можно хорошо ответить.
* Возможно, какой-то код, отсутствует переменная.
** Я использую эту библиотеку для golang redis: go-redis