我正在设计一个系统,我将有多个用户上传大量数据。我最初的例子是100个用户每天上传100Mb。
我需要获取数据,将其插入数据库,处理数据库中的数据(ETL),然后使用“抛光”数据进行分析。
上传的文件将以65k的块(初始设计)接收。
为了避免出现瓶颈我正在考虑使用MSMQ进行构建,我将数据放入MQ,然后将其传递给处理数据的不同“程序/工具”,然后通过MSMQ向ETL工具发出信号开始做它的事情。
或者我正在思考“线性”方法:
--> receive data
--> save data to sql
--> wait for upload finish (run the two above until no more chunks)
--> signal the ETL to do its thing
--> When ETL is done report "Done" to callee
哪种方法似乎更好?有没有其他选择可以研究?目标是拥有数千名用户...就我看到这种方法而言,它会锁定客户端/下载器。
答案 0 :(得分:1)
我更喜欢第一种方法。与第二种方法相比,优势在于您可以异步发送和处理MSMQ消息,并且只需很少的时间就可以保证事务的安全性。
并不是说第二个efford不会起作用 - 但第一个看起来对我的努力要少得多。
我还建议您可以查看位于MSMQ之上的一些框架。作为C#程序员,我可以推荐NServiceBus - 但我不知道你可能会使用什么。
答案 1 :(得分:0)
我建议您在收到数据后,根据目标表中最常用的索引对其进行排序。您应该在RAM中执行此操作,您可以一次排序100MB,也可以排序100 * 100MB(只有10 GB的RAM)。这样,块插入将更快(索引组件将做更少的事情),随后的选择将找到更多聚集在一起的相关行(在磁盘上彼此物理上相邻)并且在表内更少随机地传播。这将导致给定选择的物理读取更少,从而缩短执行时间。