V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rcj6056
V2EX  ›  Android

IM 即时通讯应用 接收消息时序问题

  •  1
     
  •   rcj6056 · 2023-08-24 11:08:00 +08:00 · 9171 次点击
    这是一个创建于 452 天前的主题,其中的信息可能已经有所发展或是发生改变。

    IM 即时通讯应用 关于 APP 端消息接收时序的问题 场景: A-> 发消息到服务器->服务器推送到 B A 是早上 8:00 发的消息 B 是下午 18:00 登录的 接收到服务端推送的消息

    那么这个时候

    在 B 的手机上第一条消息会显示一个时间 这个时间用 A 消息的发送时间 还是用 B 消息的本地时间

    24 条回复    2023-08-25 12:15:12 +08:00
    Znemo
        1
    Znemo  
       2023-08-24 11:10:21 +08:00
    作为用户,直觉认为应该是 A 消息的发送时间。
    kamto
        2
    kamto  
       2023-08-24 11:11:33 +08:00
    一般都用 A 投递消息到服务器成功的时间吧
    richangfan
        3
    richangfan  
       2023-08-24 11:13:33 +08:00
    市面上这么多 IM 应用,哪有按接收时间算的
    flyqie
        4
    flyqie  
       2023-08-24 11:14:10 +08:00 via Android
    敢用 B 的时间,绝对会被用户打爆。

    太反直觉了。。用户体验极差。。

    基本都是 A 消息的时间。
    dudubaba
        5
    dudubaba  
       2023-08-24 11:15:52 +08:00   ❤️ 1
    你没搞懂发送时间和接收时间(已读时间)的区别
    rcj6056
        6
    rcj6056  
    OP
       2023-08-24 11:18:43 +08:00
    @dudubaba 麻烦细嗦一波
    opengps
        7
    opengps  
       2023-08-24 11:19:05 +08:00
    统一用服务器时间作为可信时间,求差提醒校准时间
    BBCCBB
        8
    BBCCBB  
       2023-08-24 11:19:44 +08:00
    不应该用时间来排序. 服务器给消息生成一个趋势递增的 id 来排序.
    BBCCBB
        9
    BBCCBB  
       2023-08-24 11:20:22 +08:00
    rcj6056
        10
    rcj6056  
    OP
       2023-08-24 11:20:31 +08:00
    @opengps 那如果 A 偷偷改了手机的时间 他发送的时间是 8 点 server 的时间是 12 点
    B 收到的消息应该是什么时候呢
    opengps
        11
    opengps  
       2023-08-24 11:21:54 +08:00
    @rcj6056 真正操作都是以服务器时间为准。你非要用客户端时间,那就利用得到的差值进行下转换
    imherer
        12
    imherer  
       2023-08-24 11:34:24 +08:00
    肯定是 A 发送消息的服务器时间啊。
    你朋友早上 8 点发了一条消息,你晚上 6 点才收到。 你问你朋友问他是几点发的消息?
    SilentRhythm
        13
    SilentRhythm  
       2023-08-24 11:38:58 +08:00
    A 消息的发送的服务器时间
    corcre
        14
    corcre  
       2023-08-24 11:39:00 +08:00
    肯定是统一以服务器接收到的时间为准啊
    itskingname
        15
    itskingname  
       2023-08-24 12:18:58 +08:00
    应该是服务器收到 A 消息 的时间。
    zjw7sky
        16
    zjw7sky  
       2023-08-24 13:36:25 +08:00
    以服务器接收到 A 的时间为准
    zjw7sky
        17
    zjw7sky  
       2023-08-24 13:36:41 +08:00
    @zjw7sky 而且是服务器时间
    4kingRAS
        18
    4kingRAS  
       2023-08-24 14:14:57 +08:00
    顺序按消息 id ,不会按时间戳的,时间戳(无论云侧还是端侧)都非常不靠谱
    vzyw
        19
    vzyw  
       2023-08-24 15:45:06 +08:00
    服务器存消息的时间戳, 跟时区无关。 客户端把时间戳转换为本地时间。
    hiliyan0818
        20
    hiliyan0818  
       2023-08-24 16:09:10 +08:00
    按照产出的时间来确定
    dudubaba
        21
    dudubaba  
       2023-08-24 21:37:59 +08:00
    @rcj6056 服务器时间肯定是对的,那就是 A 发送后服务器收到消息,记录时间戳入库。然后等 B 上线后,触发了用户的上线订阅,然后开始拉取 B 的对应漫游消息,再推送给 B ,这个漫游消息的时间戳就是 A 发送时服务器记录的,此时会再次上传消息给服务器,告诉服务器已读(由客户端根据设备视窗实现),服务记录已读字段时间戳。
    layxy
        22
    layxy  
       2023-08-25 08:50:58 +08:00
    一切以服务器时间为准,否则 A 或则 B 修改本地时间可能出现时间错乱
    wkong
        23
    wkong  
       2023-08-25 09:26:50 +08:00
    既不是 A 消息的发送时间,也不是 B 消息的接受时间,是服务器收到 A 消息的时间。

    看我的 Github ,我们专业做 IM 的。
    Loitus
        24
    Loitus  
       2023-08-25 12:15:12 +08:00
    参考下 lamport 逻辑时钟,用服务器时间也是不对的,A 用户发消息 A B C ,可能到达服务器的时候 A B C 三条消息就乱序了 但是这三条消息有顺序的语意逻辑关系
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3252 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:35 · PVG 20:35 · LAX 04:35 · JFK 07:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.