【发布时间】:2016-12-17 09:30:56
【问题描述】:
我正在使用 gin 框架来构建 API 服务器。一般来说,我正在构建 2 个项目。项目'API' 和项目'SOCKET'。项目'API' 是Android 中使用的主要REST API,使用gin 框架(golang)开发。而 Project 'SOCKET' 是客户端的套接字服务器,它将使用套接字连接,使用 node.js (Socket.IO)
这个过程是这样开始的:
用户A:作为请求者;连接到"API"
用户B:作为响应者; B 连接到"SOCKET"
User A从android调用APIrequestData,请求将由"API"的项目处理。而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,这将等待很长时间,直到我们手动杀死或者直到用户B在线
我要求的是:
- 我们可以在 redis pub/sub 上创建类似
callback的东西吗?如果订阅者由于离线或其他原因不接受消息,我们将关闭连接。这可能吗? - 在 Node.Js 中我知道我可以使用超时功能,如果在特定时间没有收到消息,它将关闭订阅或发出任何事件,如何在 golang 上执行此操作?如果
User B处于活动状态或离线状态,我需要通知User A,以便他可以等待另一个时间来创建请求。 - 如果什么都做不到,您对我有什么建议?
我希望我的问题可以理解,并且可以很好地回答。
*可能有些代码,缺少变量。
** 我将这个库用于 golang redis:go-redis
【问题讨论】:
-
对于第一个问题,答案是否定的:stackoverflow.com/questions/23675394/…。查看 antirez 的评论以获得可能的解决方案
-
感谢您的回答。寻找 ACK 可能是我的另一个解决方案。因为我在等待第二个问题的答案呵呵:D
标签: go redis node-redis go-gin