突然想起以前做个一个 IM 的项目(项目已经结束很久了), 使用的 websocket(Django+Channels),但链接对象是存在 redis 里的 不过现在想来 底层都是 TCP , 怎么把 TCP 链接状态存到 redis 里的呢? 存的 TCP 五元组么?有点蒙蔽, 也没去看源码, 有老哥了解过的, 大致的讲解一下么。
1
IvanLi127 2023-01-06 00:19:02 +08:00 via Android 1
好奇这存下来能干啥。。。socket 对象序列化后存都是能存得了,就是这存下来有啥用?链接没了有 socket 对象好像也干不了什么?
|
2
ruxuan1306 2023-01-06 01:20:17 +08:00 1
是不能,只能说你自己抽象一个应用层的 sessionID 。
比如王者荣耀这种,你 4G 切 WiFi 时候,实际传输层链接已经变了,但你卡一下后,照样接着玩。 |
3
Jooooooooo 2023-01-06 01:47:22 +08:00 1
感觉提的是 A/B 问题
你想要的是想存 session? |
4
Trim21 2023-01-06 02:20:57 +08:00 via Android 1
你描述的这个例子里 redis 存的应该是 session ,TCP 是没法存到 redis 里面的。
|
5
hanxiV2EX 2023-01-06 02:40:29 +08:00 via Android 1
存 sessionid 和待发送成功的数据包
|
6
jaggle 2023-01-06 08:24:25 +08:00 via iPhone 1
你的 websocket 是 socketio 这种用 http 链接的吧?是的话还有能存 redis
|
7
wenqiang1208 2023-01-06 09:21:59 +08:00 1
之前看过群聊 group 的实现
channels_redis 一层 存储的是 group (房间) + 每个房间的人(链接,每个链接分配的唯一字符串), 以及还会存储一下转发的消息(消息有过期时间) ps:channels_redis 大版本升级,存储方式 会变化。 |
8
awalkingman 2023-01-06 09:43:01 +08:00 2
不是很清楚你的存储 websocket 对象是指什么,但是一个客户端 M 和服务器 A 建立了 websocket 连接,是没办法通过某种共享介质让服务器 B 给客户端 M 发消息的,除非服务器 B 也和客户端 M 建立了 websocket 连接。redis 能存就是 [客户端 M 和服务器 A 建立了 websocket 连接] 这个信息。
|
9
rev1si0n 2023-01-06 11:38:16 +08:00 1
你认为虚拟机里创建 100 个 TCP 连接到百度,拍摄快照后再恢复,那 100 个连接还是那 100 个连接嘛?
|
10
jack778 2023-01-06 12:53:12 +08:00 1
我也尝试过,不要这样弄,你服务器重启了 scoket 链接也失效了,所以用应用内缓存就可以了
|
11
kaneg 2023-01-06 14:18:34 +08:00 1
websocket 和普通的 socket 没有两样,都是网络层,这一类资源是不能持久化的,或者说持久化是没有意义的。
|
12
YangXin90 2023-01-06 17:08:46 +08:00 1
|