im正在设计一个系统,让多个用户上传大量数据。我最初的例子是100个用户每天上传100Mb。
我需要获取数据,将其插入数据库,处理数据库中的数据(ETL),然后使用"抛光"的数据进行分析。
上传的文件将以65k的块接收(初始设计)。
为了避免出现瓶颈,我考虑使用MSMQ来构建它,在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
哪种方法似乎更好?有其他选择吗?目标是拥有数千名用户。。。在我看来,这种方法会锁定客户端/下载程序。
我更喜欢第一种方法。与第二种方法相比的优势在于,您可以异步发送和处理MSMQ消息,并且只需很少的eft就可以确保它们的事务安全。
并不是说第二个efford不起作用,但第一个efford对我来说似乎不那么费力
我还建议您可能想看看MSMQ之上的一些框架。作为一名C#程序员,我可以推荐NServiceBus,但我不知道你可能会使用什么。
我建议在收到数据后,根据目标表最常用的索引对其进行排序。你应该在RAM中这样做,你可以一次对它进行100MB的排序,也可以将所有100*100MB(只有10GB的RAM)进行一次大排序。这样,块插入会更快(索引组件要做的事情会更少),随后的选择会发现相关行更聚在一起(在磁盘上物理上彼此相邻),在表内的随机分布更少。这将导致对给定选择的物理读取更少,从而提高执行时间。