我从单个websocket连接接收了很多并发级别的数据。数据以json格式输入,需要进入表名,需要进入4列的数据(所有4个都是int或double,以便了解数据类型和规模)。
例如,假设我每秒获得1000行数据,需要转到大约100个不同的表(每秒每表10行)。我对MySQL(特别是MariaDB)中的这种数据规模相对较新。在我开始这个之前,我是否需要担心这么快写入数据库?如果我在插入完成之前得到另一个查询,是否会有积压/我是否会丢失无法插入的数据?无论如何,我可以判断我是否缺少数据?
我的计划是用python编写,但如果问题出现就可以适应C ++(只有这样才会出问题,不一定只是为了提高性能)。
完整数据流:
Websocket Handler:
连接:WSS://..../streams =流1&安培; ..stream100
回调:@process_data(msg)
def process_data(msg):
#msg exp: {"table":"stream1", "v1":100, "v2":101, "v3":.000005, "v4":.0002}
connection.execute("""INSERT INTO {}
VALUES ({}, {}, {}, {})
""".format(
msg['table'],
msg['v1'],
msg['v2'],
msg['v3'],
msg['v4']
)
)
我每秒大约有1000个消息。
TL; DR:我是否会丢失数据/搞砸了这个设置?它的工作量很小,有2个流(我想,但我不知道我是否已经丢失了数据),但我需要大幅度扩展它。
对不起,如果这是一个愚蠢的问题。
编辑:MyMaths!="好"
答案 0 :(得分:0)
主要的开销是MySQL,而不是Python或C ++,所以不要改变应用程序语言。
100 INSERTs
/秒是我使用的截止值 - 比这慢,而MySQL / MariaDB“只是开箱即用”。比这快,你可能需要一些调整。
在可行的情况下,通过在单个INSERT
语句中插入多行来获得良好的提升。我认为python有一个特殊的要求。一次插入100行(到一个表中)的速度大约是每INSERT
行一行的10倍。
SSD可能会给你10倍。
已经有1M /秒的基准测试 - 但这不仅适用于价格适中的硬件上的凡人。
InnoDB可以更改一些可调参数。 (例如innodb_flush_log_at_trx_commit=2
)。
至于“缺失数据” - 这是代码另一面的问题。如果它无法跟上,那么MySQL方面只会变得更好而且更好。
我假设python有一个很好的库来解析JSON?
如果通过“streams”,你的意思是“线程”,那么你每个线程也必须有一个连接,除非你将数据反馈给一个线程来完成所有的写操作。无论哪种方式都可行。
为什么有100张桌子?如果所有表基本相同,则可能是“错误”架构设计。
构建测试框架以对代码进行压力测试。如果你得到2000 /秒,那么代码应该足够好,可以稳定地做到1000 /秒。
如果您需要超过1000 /秒,请参阅http://mysql.rjweb.org/doc.php/staging_table
PS:1000/100不等于100。