国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

用websocket發(fā)送消息,有個比較大的疑問

Leooo

使用的是Gateway框架
用戶A通過ajax發(fā)送消息到php框架,php框架調用GateWayClient向用戶B發(fā)送消息
問題:
1、如果這時候用戶B的網(wǎng)絡不好,導致沒有收到這條消息,過一會網(wǎng)絡又好了,那么消息看起來就是缺失一截
2、如果使用回執(zhí),php框架向用戶B發(fā)送消息,用戶B收到消息后回發(fā)一條消息給服務端,那么,如果要實現(xiàn)消息的補發(fā)應該怎么做,難道每使用GateWayClient推送一條消息,都要做一個定時器?
?

4873 7 1
7個回答

Leooo

請教一下大家的做法

  • 暫無評論
Leooo

有人嗎
?

  • 暫無評論
six

每一條消息都存在數(shù)據(jù)庫里,每條消息都有個已讀未讀字段。
每條消息發(fā)到對方客戶端后客戶端給服務端發(fā)一個請求標記此消息已讀。
這樣就能知道哪些消息沒讀了,下一次登錄的時候或者網(wǎng)絡不好連接斷開重連時ajax請求一遍數(shù)據(jù)庫就知道哪些沒讀,拉過來顯示就好了
?

  • 暫無評論
abcde123456

1、要發(fā)的消息加入數(shù)據(jù)庫, 2、定時查詢數(shù)據(jù)庫并發(fā)送消息, 3、客戶端收到消息后通知服務端把消息標為已讀

  • 暫無評論
dignfei

消息保存到redis。
客戶端斷開,如果網(wǎng)絡又好了,會觸發(fā)重新連接??梢栽谶B接時觸發(fā)發(fā)送所有的未發(fā)送消息。我就是這樣做的

  • Leooo 2019-09-28

    我也是用這樣的方法實現(xiàn)的,但是寫完才發(fā)現(xiàn)另一個致命的問題,就是GateWay的連接無法做到立馬斷開!比如A發(fā)消息給B,先判斷B是否在線,在線就直接推,不在線就存redis,然后一上線就推,問題出在,B突然斷線,而GateWay需要時間才能把B踢出在線列表

dignfei

比如A發(fā)消息給B,先判斷B是否在線,在線就直接推,不在線就存redis,然后一上線就推,問題出在,B突然斷線,而GateWay需要時間才能把B踢出在線列表? ? 錯誤
?
應該 : 先保存到 redis 。然后推送給B,如果B收到返回信息,
a、收到B的反饋后就從redis刪掉。
b、沒收到反饋,重試2次,還不行則說明斷線了。下次重連時再發(fā)

  • Leooo 2019-09-28

    我明白你意思了,謝謝你

kenny534

也可以使用全局變量保存每個用戶的“待發(fā)消息”,收到回執(zhí)后刪除對應消息
每次發(fā)消息的步驟如下:
1、將最新的消息加入此隊列;
2、從隊列的第一條開始發(fā)送(如果收到用戶的“回執(zhí)”,則對應消息會被從該隊列中刪除);
這樣可以保證消息不重復發(fā)送,也不丟失,如果有問題,再分析!

  • Leooo 2019-09-30

    目前正是這樣做的,只是使用的是mysql,在嘗試使用redis

  • kenny534 2019-09-30

    數(shù)據(jù)庫不如內存快,多種方式都可以嘗試,有時間的話,可以對比一下,哪個方式最優(yōu)

年代過于久遠,無法發(fā)表回答
??