2009-08-05 90 views
3

我正在开发一个需要在Windows平台中进行扩展的服务。是否有快速和可扩展的解决方案来保存数据?

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

将接收到的数据保存到Microsoft SQL Server等通用数据库是不切实际的(我想)。

是否有另一种解决方案来保存数据?考虑到它每天会收到超过600万的“记录”。

有5个步骤:

  1. 接收经由HTTP处理的数据(C#);
  2. 保存接收到的数据; < - HERE
  3. 请求保存的数据进行处理;
  4. 处理请求的数据;
  5. 保存处理后的数据。 < - 这里

我的前液是:

  1. 接收经由http处理(C#)中的数据;
  2. 将收到的数据保存到消息队列;
  3. 来自的请求MSQ使用windows服务处理保存的数据;
  4. 处理请求的数据;
  5. 将处理后的数据保存到Microsoft SQL Server(这里是瓶颈);
+2

你为什么认为这是不切实际的?你有没有试过模拟它,并检查给定的硬件配置中可能遇到的限制? – jvanderh 2009-08-05 17:51:27

+2

你能指定你使用的是哪个版本的Sql Server吗?如果它是Express版本之一,那么您将永远无法处理这种流量......另外,您应该查看您的表格索引以查看是否导致速度变慢。我基本上说:不要太快从数据库服务器解决方案中逃脱。它应该能够处理你描述的那种音量。 (当然,在足够强大的硬件上运行。) – 2009-08-05 17:55:03

+0

600万条记录不一定那么多。记录有多大?我认为我会默认使用SQL DB,那么当且仅当它确实是瓶颈时,才会考虑像Amazon的SimpleDB这样的东西。只需使用一个数据存储库模式,以后可以轻松地将其交换出来...... – ConsultUtah 2009-08-05 17:56:55

回答

9

每天600万条记录听起来并不特别巨大。特别是,这是而不是每天24小时500次 - 您是否预计流量会“突发”?

我不会亲自使用消息队列 - 我现在已经被不稳定和普遍困难咬伤了。我可能会直接写入磁盘。在内存中,使用一个单线程写入磁盘的生产者/消费者队列。生产者只会将记录转储到队列中。

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

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

我建议你尽早做一些测试,看看数据库能应付什么(并让你测试各种不同的配置)。找出瓶颈所在,以及他们会伤害你多少。

3

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

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

1

为什么不能做到这一点:

1)接收数据
2)过程数据
3)保存原来的,并立即

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

相关问题