2

我被指派更新现有的收集来自销售点的数据并将其插入中央数据库的系统。现在工作的是基于 FTP/SFTP 传输,其中信息每天发送一次,通常在晚上。不幸的是,由于不稳定的连接链接(低质量的 2G/3G 调制解调器),一些文件似乎已损坏。以这种方式连接的只有几家商店,一切都很顺利,但随着商店数量的增加,错误变得更加频繁。更糟糕的是,

我的经理建议的想法是在白天连续发送数据。数据包会更小,因此它们的传输和插入速度会更快,中央服务器将包含实际(几乎实时)数据,夜间可用于长时间运行的数据库活动,如创建备份、重建索引等。

浏览了很多网站后,我发现:

这就是我感到困惑的地方。有这么多选择,你对这些技术有什么优缺点吗?我们将 .NET 与 Windows Forms 和 SQL Server 一起使用,但如果有必要,我们可以更改为更合适的东西。我也有点害怕服务器效率。经过一些计算,服务器每秒将接收大约 15 个数据包(峰值)。很多吗?我知道有很多网站没有严格的服务器基础设施,在线处理数百名访问者仍然运行流畅,但网站主要将数据上传到客户端,这里我们将从客户端下载。

我还发现了一些类似的 SO 问题:Middleware to build data-gathering and monitoring for a Distributed System 其中提到了 DDS。您如何看待引入一些中间件服务器来处理到销售点的低质量链接,这样主服务器就不会被 1KB/s 的传输阻塞?

我会很感激你的帮助。先感谢您!

4

2 回答 2

1

Rabbitmq 可以轻松应对每秒数千条 1kb 的消息。

由于您的用例不是关于处理实时数据,我会说您应该合并少量消息并将它们作为批处理发送。这足以分散一天的负载。

由于这里的动机不是实时处理数据,因此任何传输层都可以完成这项工作。甚至 ftp/sftp。因为 rabbitmq 在这里可以正常工作,所以它不是典型的用例。

正如您提到的,您担心的一个问题是网络速度慢/不可靠,我建议在发送文件之前压缩文件,并在接收端立即验证它们的完整性。Rsync 或类似的东西可能会在这方面做得很好。

于 2015-05-08T13:30:24.933 回答
0

据我了解,您基本上有两个问题:

  1. 呼叫数据丢失/损坏的可能性
  2. 数据库写入性能

呼叫数据丢失/损坏的可能性是由于从客户端到服务的数据传输缺乏可靠性造成的。

并且不清楚是什么导致了数据库争用/性能问题,除了对高容量的模糊参考之外,因此这个答案将更倾向于解决第一个问题。

您已经正确地确定了对可靠异步通信传输的需求,以作为解决当前设置中的可靠性问题的一种方式。

查看 MSMQ 以提供此功能是有效的第一步。MSMQ 通过开箱即用的存储和转发消息传递语义提供可靠的通信,并且只需要很少的配置方式。

不幸的是,虽然适合您的需求,但 MSMQ 依赖于两件事:

  1. 可靠的网络协议,以及
  2. 在发送和接收机器上运行的客户端服务。

根据您上面的描述,我不相信 1 存在(互联网不是可靠的网络),并且您可能会为 2 感到困惑 - MSMQ 仅随 Windows Server 或桌面上的商业/企业版本的 Windows 一起提供。(*请参阅以下...)

作为网络可靠性问题的一种可能解决方案,您可以使用 WCF 或 RESTful 端点(使用NancyWebApi)公开通过 HTTP 公开的服务操作,这将接受来自客户端计算机的传入调用。这些技术完全不同,因此您需要确保尽早做出正确的选择。

WCF开箱即用地支持 SOAP 1.2 规范中的WS-ReliableMessaging ,这允许通过 http 进行可靠的 Web 服务调用,但是它非常需要配置,通常不是一个很好的框架。

REST 比 .Net 中的 WCF 简单得多,非常轻量级且易于使用。但是,为了可靠的交付,您必须公开某种 GET 操作(除了允许客户端发送数据的 POST)(在合理的时间范围内)被调用以验证数据是否已提交。如果 GET “确认”的结果是否定的,客户端将不得不实现某种重试语义。

尽管 WCF 路由需要两个操作而不是一个,但我更喜欢 REST 方法。我已经做了很多,并且发现 REST 服务更适合使用。

(*) 这并不是说 MSMQ 在您的最终解决方案中不起作用,只是它不会用于解决传输可靠性问题。但是,它仍可用于解决您的另一个问题,即数据库写入争用。如果您要在传入请求进入服务器后对其进行排队,那么这些可以由“离线”进程处理,然后可以以可靠的方式执行所需的数据库操作。这可以通过使用 MSMQ 事务队列来完成。

回应评论:

99% 的消息从商店传递到主服务器,但如果需要一些更改(价格更正、折扣等),则必须将这些数据发送到商店。

这种改变事情。如果我从一开始就了解您有双向需求,并且看到您是如何设法建立 msmq 通信的,我会推动您使用 NServiceBus,它是一个非常非常酷的 MSMQ 包装器。我会这样做的原因是您似乎既有单向方式又有发布-订阅要求,NServiceBus 非常支持这一点。

于 2015-05-11T15:17:11.973 回答