• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ansenlee
V2EX  ›  程序员

毫秒级的多人实时操作后端用什么语言和数据结构比较靠谱?

  •  
  •   ansenlee · Dec 7, 2015 · 6443 views
    This topic created in 3837 days ago, the information mentioned may be changed or developed.
    目前有个想法,多人的实时操作,每一步都保存到服务器,操作的同时其他人也可以实时看到。

    这种项目用什么后端语言性能比较好?

    另外,直接写入文件是不是要比写入数据库来的更快?
    39 replies    2016-02-27 00:44:57 +08:00
    bigfei
        1
    bigfei  
       Dec 7, 2015
    nodejs 好了, eventemitter
    Mirana
        2
    Mirana  
       Dec 7, 2015
    node socket.io ,如果数据库在本地那么写数据库快点
    k9982874
        3
    k9982874  
       Dec 7, 2015
    c/c++
    硬盘 IO 永远是最慢的,数据库有自己的 CACHE ,除非数据库 overload 。
    数据可以存到 memcached ,写个其他服务或计划任务往数据库里插。如果怕丢失数据考虑消息队列。
    ansenlee
        4
    ansenlee  
    OP
       Dec 7, 2015
    @bigfei nodejs 处理这种毫秒级,好像并没有性能特别好
    ansenlee
        5
    ansenlee  
    OP
       Dec 7, 2015
    @k9982874 但是这种毫秒级的,是不是要有多个中间库才靠谱?
    @Mirana socket 已在考虑范围内~~~数据库是在服务器
    k9982874
        6
    k9982874  
       Dec 7, 2015
    看你的业务,中间层越多复杂度越高,越不靠谱,简单既是美。
    mengzhuo
        7
    mengzhuo  
       Dec 7, 2015
    只有内存才可以
    ansenlee
        8
    ansenlee  
    OP
       Dec 7, 2015
    @k9982874
    @mengzhuo

    如果写缓存的话,只能考虑数据队列了。。。好惆怅
    chinawrj
        9
    chinawrj  
       Dec 7, 2015
    得有一个好的框架,不要保证的是多人之间的 ms 级别延时。你的写入操作应该也是抽象成一个“人”来对待,和其他人一样接收数据。只不过这个“人”是把数据保存。
    chinawrj
        10
    chinawrj  
       Dec 7, 2015
    @chinawrj 不能修改真痛苦。将就着看看吧。有错别字
    ansenlee
        11
    ansenlee  
    OP
       Dec 7, 2015
    @chinawrj 其实毫秒级别保存还好,但是多人的实时的操作同一个文件,就有点头疼了。。
    leveraging
        12
    leveraging  
       Dec 7, 2015
    其实和语言关系不大,你该说说具体的场景。多人写文件可是得加锁呀。数据库肯定已经考虑好了这个问题。
    shyling
        13
    shyling  
       Dec 7, 2015
    我觉得毫秒级的或许 node 不是一个特别好的选择吧=。=
    c4pt0r
        14
    c4pt0r  
       Dec 7, 2015
    显然是 go 啊....
    cheng007
        15
    cheng007  
       Dec 7, 2015
    毫秒级啊, 你看一下面的数据,你觉着可能吗?
    Mac-mini:~ ng$ ping www.baidu.com
    PING www.a.shifen.com (14.215.177.37): 56 data bytes
    64 bytes from 14.215.177.37: icmp_seq=0 ttl=57 time=6.383 ms
    64 bytes from 14.215.177.37: icmp_seq=1 ttl=57 time=5.174 ms
    64 bytes from 14.215.177.37: icmp_seq=2 ttl=57 time=5.423 ms
    64 bytes from 14.215.177.37: icmp_seq=3 ttl=57 time=5.008 ms
    64 bytes from 14.215.177.37: icmp_seq=4 ttl=57 time=6.042 m
    hr6r
        16
    hr6r  
       Dec 7, 2015
    @cheng007 多人之间毫秒, 并不代表自己的操作之间要毫秒嘛~
    ansenlee
        17
    ansenlee  
    OP
       Dec 7, 2015
    @cheng007 是多人操作
    c742435
        18
    c742435  
       Dec 7, 2015
    @ansenlee 请详细说明应用场景
    lightening
        19
    lightening  
       Dec 7, 2015
    Erlang?
    9hills
        20
    9hills  
       Dec 7, 2015
    任何一种语言都可以,直接写内存,然后定时 dump 到数据库

    不要毫秒级去操作数据库。。。
    lovedboy
        21
    lovedboy  
       Dec 7, 2015
    Mutoo
        22
    Mutoo  
       Dec 7, 2015
    典型的网游服务器
    mengzhuo
        23
    mengzhuo  
       Dec 7, 2015
    @ansenlee

    和语言其实关系不是特别大
    而且内存不是缓存!
    主要看你的场景,如果是需要大家尽快获得这个变化的结果,只能用内存,任何磁盘 IO 都不能满足需求。
    服务器负责锁、校验和广播结果
    ansenlee
        24
    ansenlee  
    OP
       Dec 7, 2015
    @mengzhuo 明白啦~~多谢!
    loqixh
        25
    loqixh  
       Dec 7, 2015   ❤️ 1
    GC 随便停顿都是 50ms 以上
    tennix
        26
    tennix  
       Dec 7, 2015   ❤️ 2
    不知道这种实时性能不能满足你的要求 http://www.phoenixframework.org/blog/phoenix-10-the-framework-for-the-modern-web-just-landed#the-real-time-web

    这是里面的演示 demo ,反正第一次看到这种效果时我是震惊了
    不知道 V 站还是不是自动显示油管
    ansenlee
        27
    ansenlee  
    OP
       Dec 7, 2015
    @tennix 这个我看过,我们的原理是一样的,但是操作的东西不仅仅是文本了。。。可能是 canvas 绘图
    cheng007
        28
    cheng007  
       Dec 7, 2015
    @hr6r 毫秒级数据同步啊
    Comdex
        29
    Comdex  
       Dec 7, 2015
    golang 挺合适的, 1.5 的 gc 已经比较好了
    adexbn
        30
    adexbn  
       Dec 8, 2015 via iPhone   ❤️ 1
    来说说我参与过的,
    德意志银行外汇清算中心, C++/Oracle
    Nortel , C++/Timesten
    Blizzard 战网, C++/MM,Oracle
    上海地铁清算中心, C++/Oracle
    长三角高速公路联网清算中心, C++/Oracle
    .......
    .......
    ansenlee
        31
    ansenlee  
    OP
       Dec 8, 2015
    @adexbn 这略牛逼啊。。。
    xiamingchong
        32
    xiamingchong  
       Dec 8, 2015
    golang 不谢
    libook
        33
    libook  
       Dec 8, 2015   ❤️ 1
    其实用什么语言都好,因为毕竟现在什么都可以用硬件来堆,就看你看重哪一点了,如果想省钱就用高效的编译型语言,如果想开发简捷就用解释型 OO 语言。

    实时的话就不要用 HTTP 协议啦,因为一条消息都要重新三次握手建立一个 TCP 连接超级慢,建议用类 Web Socket 技术。

    据说 Meteor (后端 Node ,前端跨平台)可以简单快速地开发出实时同步的应用,之前看人演示过,简直就像黑科技。

    直接写入文件和直接写入数据库应该速度差别不大,差别有可能在于读,因为数据库是可以检索的。
    如果你用 Linux 服务器的话操作系统是会自动使用空闲内存做高速缓存的( free 命令中的 buff/cache 字段),内存大的话无论是写文件还是普通的硬盘数据库也能像内存数据库一样快速响应(在理论命中率高的情况下),如果数据量大用不起太多内存的话可以用 Redis 一类的内存硬盘两栖数据库,将部分数据放到内存里使用,自动同步到硬盘上。

    最后在写逻辑的时候不要忘记要处理同时操作的情况,非原子操作可能会导致死锁或脏数据的产生。。。
    ansenlee
        34
    ansenlee  
    OP
       Dec 8, 2015
    @libook 这解释解答了大部分问题~~~棒!!!感谢
    gkiwi
        35
    gkiwi  
       Dec 8, 2015
    楼主参考这个下:

    想实现一个多人同时协同画画的软件,有木有啥思路?
    https://cnodejs.org/topic/54e846168ff821b53f851860

    你画我猜?如果是网页端,不晓得 websocket 合不合适,感觉性能各方面可能不是在后端,而是用户前端与后端的网络通信,这个速度不关后端语言的事情
    ansenlee
        36
    ansenlee  
    OP
       Dec 8, 2015
    @gkiwi 工作类的,不是游戏和娱乐类的应用。
    话说这提问炸出了好多好答案,改天单独整理成一篇实时协作专题
    warDoggie
        37
    warDoggie  
       Dec 8, 2015
    @adexbn 厉害厉害~ 好在意 Blizzard 战网, C++/MM,Oracle 。有相关的资料可以分享吗
    cloudzhy
        38
    cloudzhy  
       Dec 10, 2015
    毫秒级就不要用以太网
    macliu
        39
    macliu  
       Feb 27, 2016
    用野狗可以很快解决 ( : wilddog.com
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1029 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 22:31 · PVG 06:31 · LAX 15:31 · JFK 18:31
    ♥ Do have faith in what you're doing.