0

我正在设计一个系统,我将有多个用户上传大量数据。我最初的例子是 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

哪种方法似乎更好?有没有其他选择?目标是拥有数千名用户......据我所知,这种方法会锁定客户端/下载器。

4

2 回答 2

1

我更喜欢第一种方法。与第二种方法相比的优势在于,您可以异步发送和处理 MSMQ 消息,并且只需很少的努力就可以保证它们的事务安全。

并不是说第二次努力不会奏效——但第一次对我来说似乎少了很多努力。

我还建议您可能想查看一些位于 MSMQ 之上的框架。作为一名 C# 程序员,我可以推荐NServiceBus - 但我不知道您可能会使用什么。

于 2012-02-22T14:13:30.307 回答
0

我建议你收到数据后,根据目标表最常用的索引进行排序。您应该在 RAM 中执行此操作,您可以一次对其进行 100MB 排序,也可以将其全部排序为 100*100MB(它只有 10 GB 的 RAM)。这样,块插入会更快(索引组件要做的事情会更少),随后的选择会发现相关的行更多地聚集在一起(在磁盘上物理上彼此相邻),并且在表中随机分布的更少。这将导致给定选择的物理读取次数减少,从而缩短执行时间。

于 2012-03-07T12:36:48.837 回答