所以 Websocket 的本质是把前端的轮询放到后端了?

2017-03-27 23:24:16 +08:00
 gy134340

本来比较传统的实时查询数据库更新是在前端 ajax 来轮询,现在看了一下 socket.io 的实现 websocket 如果来做数据库变动监测还是要写 setTimeInterval() 之类的,所以 websocket 出来的意义就是为了节省每次重发 http 请求的带宽吗? 求大神指导如何实现 实时监测数据库字段的更新并发送给前端,难道真的要换 PostgreSQL 这样支持 listen/notify 的数据库?

8131 次点击
所在节点    问与答
33 条回复
billlee
2017-03-27 23:38:10 +08:00
谁说后端一定要轮询数据库?
UnisandK
2017-03-27 23:44:30 +08:00
Transfer-Encoding: chunked
gy134340
2017-03-27 23:51:30 +08:00
@billlee 说话说一半,老哥,说完啊
HongJay
2017-03-27 23:52:46 +08:00
好像是节省带宽|
denghongcai
2017-03-28 00:01:09 +08:00
写库时触发更新事件或者简单点换数据库

如果用轮询的做法确实是没什么区别
barbery
2017-03-28 00:08:56 +08:00
没搞懂, websocket 的优势是 push ,数据库发生了变动就应该主动 push ,而不是还是被动的查询数据检查是否有变动
changwei
2017-03-28 00:09:32 +08:00
如果只是单纯的让页面数据模型和后端数据库的数据模型同步,那么可以用各种框架提供的事件方式来触发 websocket 的推送,并不用轮循。
mkdong
2017-03-28 00:10:25 +08:00
@gy134340 后端不一定要轮询啊,比如前端发 1+1 给后端,后端计算之后发给前端 2 。 socket 嘛,双向都可以发东西给对方的。
xylitolLin
2017-03-28 00:11:06 +08:00
不知道是不是这个本质,但是哪怕是,我觉得也是值得。前端的体验和 Http 请求关系太大了,能省则省
gy134340
2017-03-28 00:14:02 +08:00
@barbery 那如果是单独的两个应用,一个 insert 数据,另一个对数据库有读的权限,数据库发生变动怎样自己 push, 触发器吗,注意是两个单独分开的应用,对着同一个数据库
FrankFang128
2017-03-28 00:25:03 +08:00
节省 HTTP 请求这还不够吗
cevincheung
2017-03-28 00:25:38 +08:00
@gy134340 #10

browser <-> websocket <-> socket-server

( QueueProducer ) -> QueueManager -> ( QueueConsumer -> socket -> socket-server )
cevincheung
2017-03-28 00:28:40 +08:00
@gy134340 #10

修改了用户名,触发修改事件(应用级代码逻辑层),入队列

队列消费者 -> 通知 socket-server-gateway -> 用户 ID 为 X 修改了用户名

socket-server-gateway -> 这个用户在哪个 socket-server 上?登录了没?没?放弃,不处理。在线?推送消息给他。

socket-server -> 用户 ID 为 X 的在我这,知道了,正在推。

browser -> 嗯,我知道了。 JS ,该你了。
gy134340
2017-03-28 00:35:55 +08:00
@mkdong 只是在做监测数据表变动时需要轮询数据表
jybox
2017-03-28 00:52:19 +08:00
socket.io 并不仅仅是 web socket ;轮询模型中额外开销是很大,即使连接可以复用,也依然要解析请求头,生成响应头;至于后端内部怎么通知是另一回事了,一般是 redis 的 pub/sub 。
SoloCompany
2017-03-28 02:53:14 +08:00
有你这样把架构和实现混在一起说的吗?
那是不是现在满大街的 ARM 的模拟器就可以说 ARM 本质上就是把指令解释放到 x86 上执行了?
msg7086
2017-03-28 07:22:22 +08:00
后端用消息队列来主动触发啊,为啥要轮询数据库?谁改了数据谁发声啊。
wwqgtxx
2017-03-28 08:14:01 +08:00
那么多消息队列都被你无视了,另外像实时弹幕直播这种活动完全不需要跑数据库嘛,服务端收到了之后直接处理一下全局广播就好了嘛
rashawn
2017-03-28 08:22:39 +08:00
websocket 跟轮询没啥关系吧
helloworld12
2017-03-28 08:27:01 +08:00
socketio 才是轮询
websocket 是 tcp 长连接

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/350755

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX