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