tctc4869
V2EX  ›  Java

要接收多个 tcp 长连接不断发送的数据并存储,哪些数据库或数据存储方案比较合适?

  •  
  •   tctc4869 · Nov 23, 2020 · 3289 views
    This topic created in 2062 days ago, the information mentioned may be changed or developed.

    在服务器建立服务端,与多个 tcp 连接保持长连接,服务端会根据客户端发送的 token 验证确定是否保持长连接建立“session”缓存,

    在某个状态开启时(我称为存储状态),要把接收多个不确定数量的 tcp 客户端(不是 http,也不是 mqtt,就是纯 tcp 连接)的数据存储到服务端里,如果可以的话,一定要根据客户端的 token+日期 分别进行保存。

    那么比较合适的存储方案或数据库是什么?我想到的是为每个长连接,在存储状态开启时,根据 token 与存储状态开启时间作为文件名生成文本文件,建立文件写入流,每次接收 tcp 数据都写入文件,当 tcp 连接关闭时,就关闭文件写入流。

    不过除了这种方案,还有其他合适的吗?比如数据库?如果 sql 数据库的话,它适合这种“在长连接环境下,不断接收长连接发送的数据并保存“的环境么?如果可以的话,java 的 pgsql 方案一般是怎么弄的?

    14 replies    2020-11-23 14:12:54 +08:00
    beginor
        1
    beginor  
       Nov 23, 2020 via Android
    建议考虑时序数据库,如果是 pg 的话, 可以用 timescaledb 插件
    crclz
        2
    crclz  
       Nov 23, 2020
    建议分块来存,这样就有思路了吧?例如,TCP 源源不断地发送数据过来,然后你这边每接收 1M 数据,就往数据库插入( token: string, chunkId: int, data: byte[]),其中 chunkId 代表块的序号
    tctc4869
        3
    tctc4869  
    OP
       Nov 23, 2020
    @beginor 我去网站看了一下,有个“免费试用”按钮?收费的?
    caotian
        4
    caotian  
       Nov 23, 2020
    国产开源的 tdengine 试试
    dzdh
        5
    dzdh  
       Nov 23, 2020
    @tctc4869 有收费服务 不使用 cluster 的话,使用开源版本即可。有企业版。
    ClarkAbe
        6
    ClarkAbe  
       Nov 23, 2020 via iPhone
    [bbolt] (没有手抖就是两个 b,一个 b 的已经归档了)kv 数据库,支持时序,直接怼进去就行了,支持树状结构....可以用日期做桶名
    opengps
        7
    opengps  
       Nov 23, 2020 via Android
    其实可以说任何数据库都可以用,我经历过 sqlserver 下的 20 万 tcp 链接,单链接 10 秒间隔直接入库。
    以前那时候还没有各种中间件的概念,用的特别简单的做法线上实践过
    tctc4869
        8
    tctc4869  
    OP
       Nov 23, 2020
    @opengps 是吗,每个 tcp 发送的数据,直接一个 insert 进去?
    opengps
        9
    opengps  
       Nov 23, 2020 via Android
    @tctc4869 数据库有自己的连接池,并不是应用层的一个 tcp 占用一个数据库链接的
    buf1024
        10
    buf1024  
       Nov 23, 2020
    数据库没有你想象中那么弱,任意一个主流数据库都能满足你的需求。
    Macv1994
        11
    Macv1994  
       Nov 23, 2020
    时序数据库吧 我记得好像有个国产开源的 不记得叫啥了
    xylophone21
        12
    xylophone21  
       Nov 23, 2020
    这不是典型的流式计算的前一半吗?(不确定后一半是不是你没说)可以看看 Apache Flink 等是怎么玩的
    1. 数据不大怎么搞都没事,数据大一般是用一个消息队列异步处理
    2. 并不一定要把原始数据入库,存 S3,HDFS 等都可以
    3. 不一定需要专门的 TCP 长连接(当然可能你之前就是这样),HTTP 也是 keep-alive 的,还方便
    misaka19000
        13
    misaka19000  
       Nov 23, 2020
    看起来是和时序
    GooooooniX
        14
    GooooooniX  
       Nov 23, 2020
    需要计算数据量和数据发送频率。
    我们也是 TCP 发送数据,我就是 PG 存储的。
    每个长链接,每隔 10s 一次数据。数据量不大 5 KB 以内。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5399 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 96ms · UTC 06:01 · PVG 14:01 · LAX 23:01 · JFK 02:01
    ♥ Do have faith in what you're doing.