【问题标题】:Scheduled, long running user queries计划的、长时间运行的用户查询
【发布时间】:2015-05-02 09:31:37
【问题描述】:

我需要社区的一些建议来满足我的要求。以下是要求,我需要一些方法建议。

来自客户端的用户需要从我的源数据库(假设是我的生产服务器中的 SQL 数据库)中检索数据。用户通过中间服务层(WCF Rest 服务)访问数据。在另一台服务器(信息服务器)上,我有一个 SQL 数据库(信息数据库),它将保存所有可以请求的查询。由于在某些情况下我的数据非常庞大,因此我为用户提供了安排数据检索并稍后查看数据的选项。每个用户的日程安排信息也将存储在信息数据库中。我还允许用户在需要时实时检索数据。

在这两种情况下,我都想从源(生产数据库)查询数据,以文件格式(可能是 CSV 或 excel)存储它们,然后当用户需要数据时,我会将数据发送到客户端。

由于查询存储在 InfoDB 中。我让管理员为每个查询定义计划运行时间。这是为了使管理员能够在对服务器的调用较低时调整在夜间运行的长时间运行的查询。如果用户要求实时运行查询,我会允许这样做。

作为解决方案架构,我想到了这一点:

  1. 我将在 Info Server 上安装 WCF 休息服务。该服务将充当用户的呼叫点。当用户实时调用查询时,服务将获取结果,保存为文件格式并传输过来。如果用户安排了查询,服务将在信息数据库中为用户/查询添加一个条目。
  2. 我将在信息服务器上拥有一个 Windows 服务。此 Windows 服务将定期检查 Info DB 中的计划查询条目,如果查询在计划时间内,它将开始运行查询,获取数据并将其保存到文件位置,并将文件位置条目添加到计划条目.这将使我能够跟踪哪些计划已完成以及数据在哪里可用(文件路径)。

现在这是我的问题:

  1. 我的数据可能很大,WCF 休息服务是否足以通过网络传输大文件?我可以通过有线传输文件还是需要以 JSON 格式传输数据?什么是最好的方法。
  2. 如果我使用 Windows 服务,这是一个好方法还是有更好的选择?我问的原因是因为根据我的理解,Windows 服务必须始终运行,因为我需要找出计划的条目。这意味着 Windows 服务将在特定的时间间隔检查信息数据库并查看是否应该运行计划条目。在理想情况下,Windows 服务将在一天中运行并定期检查数据库而无需太多操作,因为最好所有计划都在夜间进行。
  3. 我使用了中介服务方法,因为如果我明天需要迁移到云,我可以轻松迁移此解决方案。我的假设是否正确?
  4. 如果我明天搬到云端,我是否可以对数据传输进行加密(可能是数据加密或文件加密)。我对数据加密/解密一无所知。

需要您对此提出建议。

【问题讨论】:

  • 你已经足够长,你必须知道一个好的标题应该是什么样子。这不是这样的情况。它必须捕获内容。
  • Artjom B. :我认为这个标题是最好的,因为我只需要社区的建议。我已经想到了一种我已经描述过的方法,只是想检查是否有更好的方法可以做。
  • StackOverflow 在这里构建了一个有用的问题和答案库。大多数用户通过搜索引擎找到问题和答案。现在想一想这个问题将如何以这样一个模棱两可的标题出现。当然,它传达了一些关于您的意图的信息,但没有传达关于内容的信息。
  • Artjom B.:好的。知道了。我做同样的事情(按引擎搜索),但我想不出更好的标题。仅仅因为这个问题有很多部分。你有什么想法吗?请建议。我会改标题

标签: c# wcf encryption service architecture


【解决方案1】:

我的数据可能很大,WCF 休息服务是否足够好? 通过网络传输大文件?我可以通过电线传输文件吗? 我需要以 JSON 格式传输数据吗?什么是最好的方法。

当你说巨大时,有多大?我们说的是千兆字节、兆字节还是千字节。我经常有 100mb 的休息响应(你可能需要调整一些东西,以增加你的 MaxMessageLength,但this 应该足以让你继续前进。不过,我会接受他们的建议并使用流 API,尤其是当你在说话的时候几兆的内容。

如果我使用 Windows 服务,这是一个好方法还是有更好的选择?我问的原因是因为根据我的理解,Windows 服务必须始终运行,因为我需要找出计划的条目。这意味着 Windows 服务将在特定时间间隔检查信息数据库并查看是否应该运行计划条目。在理想情况下,Windows 服务将在一天中运行并定期检查数据库而无需太多操作,因为最好所有计划都在夜间。

小心编写自己的调度程序。您最好将事情放到队列中进行处理,然后在适当的时间启动工作人员。这样您就可以直接调用工作人员进行实时调用。另外,您可以在数据库空闲时运行它,而不是按计划运行。 “知道”服务何时空闲是很棘手的。尤其是在一个全天候用户的世界里。

我使用了中介服务方法,因为如果我明天需要迁移到云端,我可以轻松迁移此解决方案。我的假设是对的吗?

是的,将端点包装在休息服务 (WCF) 中将使迁移到云变得更加容易。

如果我明天搬到云端,我是否可以对数据传输进行加密(可能是数据加密或文件加密)。我对数据加密/解密一无所知。

HTTPS 是您的朋友。阅读this。不要在这里发明自己的,或使用专有加密。 HTTPS 陈旧、简单且很好。

【讨论】:

  • 您好 Rob,感谢您抽出宝贵时间回答我的观点。我的数据可能超过 100 MB,但我正在考虑将它们拆分为多个文件(每个文件最大 100 MB),以防数据更多。当您说 100MB 适合您时,您通常需要多少时间?对于第二点,当您说“您最好将事情放到队列中进行处理,然后在适当的时间启动工作人员。”,请您解释一下。你的意思是我在特定的时间间隔运行windows服务并检查队列吗?
  • 既然你已经阅读了足够多的问题来回答它,也许你也可以编辑它,添加一个更好的标题。有在 12 小时内回答和编辑问题的徽章。
  • 当我只是提供预先生成的内容时,通过快速连接可能只需要几秒钟。当我生成内容时,最多可能需要 2 分钟。当我开始长时间保持 http 连接打开时,我会感到紧张,网络设备(路由器负载平衡器代理等)开始做诸如切断我的连接之类的事情。 5 分钟似乎是一个常见的最大值。
  • 是的,您可以在这些时间间隔内运行该服务。调度执行比调度数据容易得多。您必须处理错过的窗口、补课时间等问题。当查询没有在可用窗口中全部完成时会发生什么?如果您让他们排队等候,您可以更轻松地做出这些决定,而且您可以在 DBA 看到空闲时间时运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
相关资源
最近更新 更多