在服务器建立服务端,与多个 tcp 连接保持长连接,服务端会根据客户端发送的 token 验证确定是否保持长连接建立“session”缓存,
在某个状态开启时(我称为存储状态),要把接收多个不确定数量的 tcp 客户端(不是 http,也不是 mqtt,就是纯 tcp 连接)的数据存储到服务端里,如果可以的话,一定要根据客户端的 token+日期 分别进行保存。
那么比较合适的存储方案或数据库是什么?我想到的是为每个长连接,在存储状态开启时,根据 token 与存储状态开启时间作为文件名生成文本文件,建立文件写入流,每次接收 tcp 数据都写入文件,当 tcp 连接关闭时,就关闭文件写入流。
不过除了这种方案,还有其他合适的吗?比如数据库?如果 sql 数据库的话,它适合这种“在长连接环境下,不断接收长连接发送的数据并保存“的环境么?如果可以的话,java 的 pgsql 方案一般是怎么弄的?
1
beginor 2020-11-23 08:54:50 +08:00 via Android
建议考虑时序数据库,如果是 pg 的话, 可以用 timescaledb 插件
|
2
crclz 2020-11-23 08:57:57 +08:00
建议分块来存,这样就有思路了吧?例如,TCP 源源不断地发送数据过来,然后你这边每接收 1M 数据,就往数据库插入( token: string, chunkId: int, data: byte[]),其中 chunkId 代表块的序号
|
4
caotian 2020-11-23 09:03:05 +08:00
国产开源的 tdengine 试试
|
6
ClarkAbe 2020-11-23 09:12:25 +08:00 via iPhone
[bbolt] (没有手抖就是两个 b,一个 b 的已经归档了)kv 数据库,支持时序,直接怼进去就行了,支持树状结构....可以用日期做桶名
|
7
opengps 2020-11-23 09:18:24 +08:00 via Android
其实可以说任何数据库都可以用,我经历过 sqlserver 下的 20 万 tcp 链接,单链接 10 秒间隔直接入库。
以前那时候还没有各种中间件的概念,用的特别简单的做法线上实践过 |
10
buf1024 2020-11-23 09:27:20 +08:00
数据库没有你想象中那么弱,任意一个主流数据库都能满足你的需求。
|
11
Macv1994 2020-11-23 10:05:49 +08:00
时序数据库吧 我记得好像有个国产开源的 不记得叫啥了
|
12
xylophone21 2020-11-23 10:30:48 +08:00
这不是典型的流式计算的前一半吗?(不确定后一半是不是你没说)可以看看 Apache Flink 等是怎么玩的
1. 数据不大怎么搞都没事,数据大一般是用一个消息队列异步处理 2. 并不一定要把原始数据入库,存 S3,HDFS 等都可以 3. 不一定需要专门的 TCP 长连接(当然可能你之前就是这样),HTTP 也是 keep-alive 的,还方便 |
13
misaka19000 2020-11-23 10:42:01 +08:00
看起来是和时序
|
14
CodeCore 2020-11-23 14:12:54 +08:00
需要计算数据量和数据发送频率。
我们也是 TCP 发送数据,我就是 PG 存储的。 每个长链接,每隔 10s 一次数据。数据量不大 5 KB 以内。 |