【问题标题】:Scalable architecture for many uses and large amount of data (MSMQ?)适用于多种用途和大量数据的可扩展架构(MSMQ?)
【发布时间】:2012-03-12 20:56:23
【问题描述】:

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

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

【问题讨论】:

  • 我不想对大文件使用消息传递,只是将它们流式传输到某个接收器(数据库、文件系统等)。您是否必须为每个文件单独触发 ETL 过程,还是以类似批处理的模式(例如每晚、每小时)?

标签: architecture scalability msmq mom


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多