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

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

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

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

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

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

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

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

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

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

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

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

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

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

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