请教 10M 级别设备在线状态的最佳设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
zhouhuab

请教 10M 级别设备在线状态的最佳设计

  •  
  •   zhouhuab Aug 27, 2024 3570 views
    This topic created in 611 days ago, the information mentioned may be changed or developed.

    需要查询设备是否在线,上次在线时间。

    我初步的想法是单独维护一个在线服务,不依赖 redis ,设备离线才写数据库。

    想请问大家有没有经验介绍。

    19 replies    2024-09-22 21:36:39 +08:00
    freemoon
        1
    freemoon  
       Aug 27, 2024
    千万级并发?简单的模型是主动推送状态到服务器,入库前先写队列,然后在对数据库做统计查询 。相信楼下还有更好的想法
    freemoon
        2
    freemoon  
       Aug 27, 2024
    在写入队列前肯定还要二次对流量调整的,千万并发 mq 估计也来不起。可以设计一个扇入模型,部署多个无状态边缘服务来均衡流量,并同时在边缘处做请求合并,然后再将合并包上报到核心服务入 mq 入库。
    R4rvZ6agNVWr56V0
        3
    R4rvZ6agNVWr56V0  
       Aug 27, 2024
    自己实现? 为此要设计 端的离线检测、多级缓存、集群分片和状态一致性的设计。
    如果并发写太大,又不想用 Redis ,Cassandra 集群倒是一个不错的选择
    aw2350
        4
    aw2350  
       Aug 27, 2024
    对数据特征做分片,例如 ID 尾号三位,不同分片的维护一个布隆过滤器 服务,上下线状态用布隆过滤器来维护
    echoZero
        5
    echoZero  
       Aug 27, 2024
    如果 1 分钟一次心跳 也是 0.16M 的 QPS ,消息队列接着,状态存储分片
    Ipsum
        6
    Ipsum  
       Aug 27, 2024
    不然试试大数据的 Kappa 架构?
    ntdll
        7
    ntdll  
       Aug 27, 2024
    如果还有其他业务信息需要传送,那么可以考虑 MQTT ,下线时间可以通过遗嘱消息实现。单纯只为了一个在线状态,那就没必要用这个了。
    ytmsdy
        8
    ytmsdy  
       Aug 27, 2024 via iPhone
    influxDB 这一类时序数据库,然后正常写心跳包就可以了。
    aliipay
        9
    aliipay  
       Aug 27, 2024
    好奇什么业务有这么大的设备量, 我所知道的开水团单车也就是这个量级
    RicardoY
        10
    RicardoY  
       Aug 28, 2024
    维护个靠谱的 KV 集群的就可以了,Redis ,Tair ,KeyDB 都随便...时序数据库也可以
    这个量级没有多大,不要把解决方案搞复杂了
    RicardoY
        11
    RicardoY  
       Aug 28, 2024
    #5 已经帮你做了估计了,160k 的 QPS 不是很多,可能需要注意下端上不要同一时刻上报心跳
    RangerWolf
        12
    RangerWolf  
       Aug 28, 2024
    歪个楼,这个级别的客户端数量,一定要想好怎么降低流量费。。。
    flmn
        13
    flmn  
       Aug 28, 2024
    看看 MQTT
    inshua
        14
    inshua  
       Aug 28, 2024   1
    "需要查询设备是否在线,上次在线时间。"
    1. 这些设备是连你还是你只负责查?
    1.1. 如果你只负责查,这个规模是很小的,当然还是要搞清楚设备是否经常掉线,查询量大不大,是 pull 还是 push 等等
    2. 如果你要负责处理 1M 连接,好好研究一下网络服务器,做的好单机能支撑
    zhouhuab
        15
    zhouhuab  
    OP
       Aug 28, 2024
    @inshua 谢谢,单机 1M ,有没有啥好的建议和文档?
    dyexlzc
        16
    dyexlzc  
       Aug 29, 2024   1
    在线服务维护

    有考虑过你的服务升级\重启、所在机器重启\断线的 case 不。

    简单点就 redis 加 key+ttl ,设备定时 ping 更新续期,设备下线主动删除 key ,ping 丢失\下线通知丢失依赖 redis 的 ttl 过期。
    这样你的服务重启、升级、机器维护,也不影响。

    redis 单进程 qps 就算 10w ,你的 10M 量级 10 * 1kk / 1kk = 10s 也能全部操作完成了。
    如果一定要 1s 内全部操作完,那就起 10 个 redis ,简单点按照某个客户端 id % 10 取余分发到某个 redis ,1 秒就能操作完 10M 的量级,实际上这个方案就是各个大厂 redis 集群基本的原理 。
    zhouhuab
        17
    zhouhuab  
    OP
       Aug 29, 2024
    @dyexlzc 10 redis 在一台多核服务器(比方说 20 cores ),还是 10 个 2core 服务器?哪个更优?
    dyexlzc
        18
    dyexlzc  
       Aug 30, 2024
    @zhouhuab 从容灾的角度考虑,推荐 10 个 2 core 服务器,如果机器挂了起码只影响部分用户的在线状态需要重新 set 。没那么多机器的话就只能一台服务器了,也不是不能用 :-p

    性能上考虑的话,两种方案理论上是一样的,如果能压测的话可以压测一下,因为 QPS 还和网络延迟、带宽有关。10 个 2core 服务器的网络条件可能会影响最终压测数据(有可能性能低于 20core * 1 )
    inshua
        19
    inshua  
       Sep 22, 2024
    @zhouhuab Achieving 5M persistent connections with Project Loom virtual threads | Hacker News : https://news.ycombinator.com/item?id=31214253 支持百万连接不难, 但能否处理过来要视负载视情况而定, 游戏服务器和物联网终端肯定是不同的.
    About     Help     Advertise     Blog     API     FAQ     Solana     2515 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 56ms UTC 15:37 PVG 23:37 LAX 08:37 JFK 11:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86