本来比较传统的实时查询数据库更新是在前端 ajax 来轮询,现在看了一下 socket.io 的实现 websocket 如果来做数据库变动监测还是要写 setTimeInterval() 之类的,所以 websocket 出来的意义就是为了节省每次重发 http 请求的带宽吗? 求大神指导如何实现 实时监测数据库字段的更新并发送给前端,难道真的要换 PostgreSQL 这样支持 listen/notify 的数据库?
本来比较传统的实时查询数据库更新是在前端 ajax 来轮询,现在看了一下 socket.io 的实现 websocket 如果来做数据库变动监测还是要写 setTimeInterval() 之类的,所以 websocket 出来的意义就是为了节省每次重发 http 请求的带宽吗? 求大神指导如何实现 实时监测数据库字段的更新并发送给前端,难道真的要换 PostgreSQL 这样支持 listen/notify 的数据库?
1
billlee Mar 27, 2017
谁说后端一定要轮询数据库?
|
2
UnisandK Mar 27, 2017 Transfer-Encoding: chunked
|
4
HongJay Mar 27, 2017
好像是节省带宽|
|
5
denghongcai Mar 28, 2017
写库时触发更新事件或者简单点换数据库
如果用轮询的做法确实是没什么区别 |
6
barbery Mar 28, 2017
没搞懂, websocket 的优势是 push ,数据库发生了变动就应该主动 push ,而不是还是被动的查询数据检查是否有变动
|
7
changwei Mar 28, 2017 via Android
如果只是单纯的让页面数据模型和后端数据库的数据模型同步,那么可以用各种框架提供的事件方式来触发 websocket 的推送,并不用轮循。
|
8
mkdong Mar 28, 2017 via iPhone
@gy134340 后端不一定要轮询啊,比如前端发 1+1 给后端,后端计算之后发给前端 2 。 socket 嘛,双向都可以发东西给对方的。
|
9
xylitolLin Mar 28, 2017 via iPhone
不知道是不是这个本质,但是哪怕是,我觉得也是值得。前端的体验和 Http 请求关系太大了,能省则省
|
10
gy134340 OP @barbery 那如果是单独的两个应用,一个 insert 数据,另一个对数据库有读的权限,数据库发生变动怎样自己 push, 触发器吗,注意是两个单独分开的应用,对着同一个数据库
|
11
FrankFang128 Mar 28, 2017
节省 HTTP 请求这还不够吗
|
12
cevincheung Mar 28, 2017
@gy134340 #10
browser <-> websocket <-> socket-server ( QueueProducer ) -> QueueManager -> ( QueueConsumer -> socket -> socket-server ) |
13
cevincheung Mar 28, 2017
@gy134340 #10
修改了用户名,触发修改事件(应用级代码逻辑层),入队列 队列消费者 -> 通知 socket-server-gateway -> 用户 ID 为 X 修改了用户名 socket-server-gateway -> 这个用户在哪个 socket-server 上?登录了没?没?放弃,不处理。在线?推送消息给他。 socket-server -> 用户 ID 为 X 的在我这,知道了,正在推。 browser -> 嗯,我知道了。 JS ,该你了。 |
15
jybox Mar 28, 2017
socket.io 并不仅仅是 web socket ;轮询模型中额外开销是很大,即使连接可以复用,也依然要解析请求头,生成响应头;至于后端内部怎么通知是另一回事了,一般是 redis 的 pub/sub 。
|
16
SoloCompany Mar 28, 2017
有你这样把架构和实现混在一起说的吗?
那是不是现在满大街的 ARM 的模拟器就可以说 ARM 本质上就是把指令解释放到 x86 上执行了? |
17
msg7086 Mar 28, 2017
后端用消息队列来主动触发啊,为啥要轮询数据库?谁改了数据谁发声啊。
|
18
wwqgtxx Mar 28, 2017 via iPhone
那么多消息队列都被你无视了,另外像实时弹幕直播这种活动完全不需要跑数据库嘛,服务端收到了之后直接处理一下全局广播就好了嘛
|
19
rashawn Mar 28, 2017 via iPhone
websocket 跟轮询没啥关系吧
|
20
helloworld12 Mar 28, 2017
socketio 才是轮询
websocket 是 tcp 长连接 |
21
misaka19000 Mar 28, 2017 via Android
楼主你需要读一下《 Unix 网络编程》
|
24
morethansean Mar 28, 2017
@gy134340 没有消息队列吗?很常见的情况啊。
|
25
wwqgtxx Mar 28, 2017 via iPhone
@helloworld12 socket.io 同时支持长轮询, xhr 轮询, websocket 底层
@gy134340 消息队列呀,大家说了那么多遍,你都视而不见是吧,不要把目光局限在数据库中嘛 |
26
panlilu Mar 28, 2017
不用消息队列的话,试试 rethinkdb?
|
27
gy134340 OP ok, 谢谢诸位老哥
|
28
z4none Mar 28, 2017 via Android
对于你这个场景,就好比自己轮询拿快递和送快递上门的区别。试想多个前端轮询是什么情况。
|
29
WispZhan Mar 28, 2017
Websocket 难道不是目的是让服务器推送更容易吗?话说为什么要轮询……
服务端可以根据数据变更的 Event 来主动向客户端发起 Push ,要么直接 push 变更数据,要么 push 一个更新请求然后让客户端自己查询。 |
31
Finest Mar 28, 2017
简单使用 redis 的 pub/sub 就不用轮询了
|
32
aleen42 Mar 28, 2017
其实还是挺有用的,且不说实时监测数据库更新,我之前做的监听二维码扫描的简单需求,若用轮询可以发现服务器所需要处理的请求会非常之多,更何况当时是用的 PHP 做后端,压力可想而知。 web socket 长链接的方案就是为了解决诸如此类问题,因此不要轻视 HTTP 请求量的减少,这意义匪浅。
|