是否有快速,可扩展的解决方案来保存数据?

时间:2009-08-05 17:47:26

标签: c# asp.net scalability

我正在开发一种需要在Windows平台上扩展的服务。

最初它将接收大约50个连接(每个连接将发送大约5kb数据),但它需要可扩展以接收超过500个未来。

将接收的数据保存到Microsoft SQL Server等公共数据库是不切实际的(我猜)。

是否有其他解决方案来保存数据?考虑到它每天将收到超过600万条“记录”。

共有5个步骤:

  1. 通过http处理程序(c#);
  2. 接收数据
  3. 保存收到的数据; < - HERE
  4. 请求处理保存的数据;
  5. 处理请求的数据;
  6. 保存已处理的数据。 < - HERE
  7. 我的解决方案是:

    1. 通过http处理程序(c#);
    2. 接收数据
    3. 将收到的数据保存到消息队列;
    4. 请求 MSQ 使用Windows服务处理保存的数据;
    5. 处理请求的数据;
    6. 将处理后的数据保存到 Microsoft SQL Server (这是瓶颈);

3 个答案:

答案 0 :(得分:9)

每天600万条记录听起来不是特别大。特别是,每天24小时每秒500 - 你认为流量是“突发性的”吗?

我不会亲自使用消息队列 - 我之前被不稳定和一般困难所困扰。我可能只是直接写入磁盘。在内存中,使用生成器/使用者队列,并将单个线程写入磁盘。生产者只会转储要写入队列的记录。

有一个单独的批处理任务,一次将一堆记录插入数据库。

一次对最佳(或至少“好”数量的记录进行批量上传)进行基准测试。您可能希望从磁盘读取一个线程,另一个写入数据库(如果数据库线程有大量积压,则文件线程阻塞),这样您就不会等待文件访问和数据库同一时间。

我建议您尽早做好一些测试,看看数据库可以处理什么(并让您测试各种不同的配置)。弄清楚瓶颈在哪里,以及它们会伤害你多少。

答案 1 :(得分:3)

我认为你过早地进行了优化。如果您需要将所有内容发送到数据库,那么在假定数据库是瓶颈之前,请查看数据库是否可以处理它。

如果数据库无法处理它,那么可能会转向Jon Skeet描述的基于磁盘的队列。

答案 2 :(得分:1)

为什么不这样做:

1。)接收数据
2.)过程数据
3.)立即保存原始数据和处理数据

如果您已经拥有它,那将为您省去再次请求它的麻烦。我会更担心你的表结构和你的数据库机器然后实际流程。我一定要确保你的插页尽可能便宜。如果这是不可能的,那么排队工作是有道理的。我不会自己使用消息队列。假设你有一台不错的SQL Server机器,假设你没有在每条记录中写入大量数据,那么每天600万条记录应该没问题。