C# 在ASP.NET MVC网站之间传输大量数据的最佳传输机制

C# 在ASP.NET MVC网站之间传输大量数据的最佳传输机制,c#,asp.net-mvc,data-transfer,C#,Asp.net Mvc,Data Transfer,我有一个场景要求我将一个大型邮件列表(>100万客户)导出到外部电子邮件系统。我对这两个应用程序都有源代码和控制权 我需要一种将数据从一个系统传输到另一个系统的机制,即: 健壮的 快速 稳妥 到目前为止,我已经建立了一个标准的MVC控制器方法来响应请求(通过https),执行一些自定义的安全检查,然后从数据库中提取数据 当从数据库检索数据时,控制器方法对结果进行迭代,并以纯文本格式写入响应,大约每100条记录刷新一次响应。接收器读取响应的每一行,并执行存储和处理逻辑 我之所以选择这种方法,是

我有一个场景要求我将一个大型邮件列表(>100万客户)导出到外部电子邮件系统。我对这两个应用程序都有源代码和控制权

我需要一种将数据从一个系统传输到另一个系统的机制,即:

  • 健壮的
  • 快速
  • 稳妥
到目前为止,我已经建立了一个标准的MVC控制器方法来响应请求(通过https),执行一些自定义的安全检查,然后从数据库中提取数据

当从数据库检索数据时,控制器方法对结果进行迭代,并以纯文本格式写入响应,大约每100条记录刷新一次响应。接收器读取响应的每一行,并执行存储和处理逻辑

我之所以选择这种方法,是因为它不需要将用户数据持久化到一个永久文件中,并且以任何语言构建的客户端都能够实现接收器逻辑,而不依赖任何专有技术(例如WCF)

我知道我可以与.NET一起使用其他传输机制,但鉴于上面列出的要求,没有一种传输机制具有总体优势


对哪些技术可能比我的请求/响应解决方案更好有什么见解吗?

我想到了两个建议,不久前我们公司也发生了类似的事情(每月有超过100万活跃用户和相关数据的收购网站需要对数据中心进行彻底的更改,包括仍然活跃的180gb数据库)

我们最终通过SSH(SQL Server 2005)设置了一个到it的拉复制,这充其量只是一个黑魔法,我们花了大约一个月的时间在研究和失败的配置之间进行了正确设置。有很多关于它的博客文章,但关键部分是:

1) 在订阅服务器数据库计算机上的SQL server configuration manager中设置命名服务器别名,指定localhost:1234(选择更好的数字)

2) 设置putty以在订阅服务器的本地主机(步骤1中的1234)和publish db的端口9876(同样,选择一个更好的数字)之间创建ssh隧道。还要确保在发布服务器上启用了ssh服务器。还要对端口保密,并为ssh权限设置安全密码

3) 为已复制数据库的端口9876在发布服务器上添加服务器别名

4) 如果数据集足够小,请创建发布并尝试使用快照初始化启动订阅服务器。如果没有,则需要在启用“从备份初始化”的情况下创建一个发布,并使用ftp在订阅服务器上还原部分备份,以通过ftp传输备份文件。对于较大的数据集,此方法比快照初始化快得多

优点:您不需要担心sql server的身份验证,“只需要”ssh隧道。若您意识到需要更多的列或架构更改,则可以轻松修改发布。您可以节省编写api的时间,该api可能只是临时的,并且可能会有更多的安全问题

缺点:这很奇怪,没有太多的官方文档,而且windows上的ssh很挑剔。如果您有一个基于linux的负载平衡器,它可能会更容易。有很多步骤

第二个建议:使用ServiceStack和protobuf.NET创建一个非常快速的Web服务,并通过https公开它。如果您知道如何使用ServiceStack,它应该非常快。如果您不这样做,这将需要一点时间,因为它采用与WebAPI和WCF不同的设计理念。Protobuf.NET是目前广泛使用的最紧凑、最快的序列化/反序列化有线格式。链接:

优点:你可以随心所欲地处理安全问题。这也是一个缺点,因为你必须担心它。这是更好的记录。您可以使用或学习一个伟大的框架,该框架将在您的余生(或直到出现更好的东西)中加速其余与Web服务相关的项目


缺点:你必须写出来。你必须测试它。您必须支持它。

为什么不使用共享数据库?“我知道可以与.NET一起使用的其他传输机制”-请说出它们的名称,以及您认为它们不够用的原因。例如,WCF可以通过SOAP1.1、1.2和REST公开服务,几乎任何语言都可以使用。除此之外,我认为你的要求不够明智。定义“不健壮”,因为任何网络互连解决方案都依赖于TCP。定义“fast”,因为它取决于要传输的数据类型以及序列化的效果。定义“安全”,您想要消息安全、传输安全、身份验证吗?您是否考虑过使用acertificate应用TLS?因此,如果您有100万客户,那么当涉及到一个文件时,它有多大?您是否计划支持分页,或者迭代是从头到尾进行的?我个人只会共享数据库,除非这是不可能的,但我会在后端构建一个进程,该进程能够比MVC应用程序更好地恢复。有时Windows服务更适合于此项工作。@Sergio共享数据库在这里不是选项,系统位于不同的网络上,并且安全限制阻止将DB服务器打开到WAN。@Codemaster-是TLS将通过SSL证书使用,因此不需要传输级安全性和消息级安全性。我知道WCF服务可以提供SOAP响应等,但由于响应是从纯文本格式处理的,所以我不认为使用WCF有什么好处,除非有我不知道的隐式可靠性改进。我刚刚使用了纯文本响应,因为在序列化方面不需要更复杂的东西。谢谢,我将同时介绍ServiceStack和Protobuf