【问题标题】:Making an azure cloud project work on/off the cloud?让一个天蓝色的云项目在云上/云上工作?
【发布时间】:2013-02-01 08:20:16
【问题描述】:

要使为 azure(也)开发的项目在云端(例如在 Windows Server 计算机上)可部署,需要哪些步骤?我的项目有 2 个工人角色。一个基本上是数据挖掘器,另一个托管(自托管)WCF 服务。它使用 Azure 表服务、队列和 Blob 服务。这些元素将如何从云端转换? SQL 数据库或 NoSql 方法?我将如何添加一个抽象级别以允许它使用实际可用的任何资源,而无需修改底层实现(即我的 DataServiceContext 类保持大部分不变)?

编辑 1:

工作者角色 Windows 服务

Azure 表服务 EntityFramework + WCF 数据服务?

【问题讨论】:

    标签: entity-framework azure wcf-data-services


    【解决方案1】:

    我曾参与过一个项目,该项目需要同时部署在云端和本地,并使用相同的代码库。也许我可以从我身边分享一些想法。

    我们在设计的时候需要关注很多方面,主要关注云和本地的不同环境,在我们的系统中构建一些虚拟化层。这样我们就可以通过配置进行切换了。

    1. 文件系统:我们有一个虚拟文件操作界面,包含文件保存、删除和获取方法。然后我们有了 local 和 blob 的两个实现类。

    2. 数据库:这可以通过支持 SQL Server 和 SQL Azure 的简单 SQL 帮助程序类轻松完成。只需要更改连接字符串。但是在使用 SQL Server 时,我们也遵循 SQL Azure 的限制,比如不能跨数据库查询。

    3. 配置:我们将一些配置移至数据库,并从 web.config 启用缓存,尤其是对于那些可能在运行时更改的配置元素。这是因为在云上部署时,除非推送新包,否则我们无法更改 web.config。

    4. 托管:由于我们的项目是 WCF 服务,因此我们为底层服务实现创建了多个托管项目。其中一些用于本地部署,例如 Windows 服务托管、控制台应用程序托管和 IIS 托管。我们还有一个 Web 角色和工作人员角色,可用于在云上托管我们的服务。托管项目非常简单,并且都使用相同的服务实现类。

    5. 日志:我们利用我们的文件系统层,以便将日志保存在本地文件(本地部署)或表服务(云部署)中。

    6. 缓存:我们从 ServiceStack 中学习了代码,并为 Windows Server AppFabric Cache 和 Windows Azure Shared Cahce 构建了缓存接口和一些实现。它可以通过配置进行切换。对于下一个版本,我们将为云服务缓存实现另一个实现类。

    7. 无状态:我们确保我们的应用程序,特别是服务实现是无状态的。这不仅对云部署很重要,对本地部署也很重要。

    希望这会有所帮助。

    【讨论】:

    • 问题是我没有使用SqlAzure,我使用了Table Service。所以我正在尝试使用 EntityFramework 代码优先方法 + WCF 数据服务来替换 Azure 表服务。这是一个好方法吗?
    • 您的意思是要使用 EntityFramework 来处理表服务吗?我认为 EF 不提供此功能,因此您可能需要对其进行深度自定义。
    • 不,使用 EntityFramework 和 WCF 数据服务来像 Windows Azure 表服务“看起来很像”。由于 TableDataContext 派生自 DataServiceContext,我认为这可能是一个好方法。你怎么看?
    • 我想我明白你的意思了。目前您有一个使用表服务的云项目,并且您想使用 SQL Server + EF + WCF 数据服务以某种方式模拟表服务,以便在您的业务层中您可以根据需要使用它们中的每一个。我从未尝试过,但我认为这是可能的,正如您所说的表服务 SDK 来自 WCF 数据服务二进制文件。但是如果您使用 WCF 数据服务,您必须通过 WCF 与您的数据库进行通信,这可能会带来性能问题。在你的表服务和 EF 前面创建一个抽象层怎么样。
    • 我该怎么做?我可以将 TableServiceContext 指向使用 SQL 数据库吗? (与此同时,我在 nuget 和源代码控制方面遇到了一些不必要的延迟,呃)
    【解决方案2】:

    不幸的是,如果不进行大量返工,您将无法完成它。尽管您的网络/工作人员角色可能更容易移动,但您的大问题是使用 Azure 存储。虽然您可以(或可能已经)抽象出您的存储并注入到任何适当的存储中,但您很可能(无论是否明确)做出了特定于 Azure 存储的设计注意事项。这意味着您实现的内容可能在 Azure 上运行良好,但在本地运行不佳。例如,您使用的 blob 存储的许多功能(例如页 blob 或冗余)在传统的基于磁盘的存储中是不可用的。

    不久前,我给 Scott Gu 发了一封电子邮件,专门询问缺少与 Azure 存储 API 兼容的本地存储产品该怎么办。他回答说 API 兼容性是他们正在努力的事情,并将在今年晚些时候(去年 2012 年)出现。我假设这指的是在本地运行的 Azure 网站(和其他 IaaS)——他们去年在预览版中宣布了这一点。就存储和计算而言,目前还没有。

    我建议您避免尝试使用相同的代码和基础架构为 Azure 和本地构建应用程序。既然您已经开始使用 Azure,请质疑内部部署的需求并尝试发现潜在需求。是安全恐惧吗?归属感?成本?也许您可以了解真正需要什么,并在您的 Azure 应用程序中解决这些问题。也许有点推销在 Azure 上运行的好处会比重写更容易。毕竟,应用程序必须在本地运行的用例并不多——否则我们根本不会做这个云计算。

    【讨论】:

    • 一个非常有趣的答案! Azure 存储的使用也是我主要关心的问题。我试图“解决”的“问题”是万一我们出于任何原因需要离开 Azure(无论是成本还是我不知道,“云是魔鬼”),如何移动可以以一种高效且直接的方式完成,无需重写太多,因为客户端已经为 Windows8、iOS 和 Android 实现。由于有大量关于如何将现有应用程序移植到云端的示例,我希望了解这样一个现有应用程序的外观,以便能够反其道而行之。
    • 为了解决(潜在的)成本问题,我创建了一个(精简的)客户群来对服务进行压力测试,看看我们在一个月内可能会产生什么样的成本。我还在服务上添加了 gzip 压缩。目标是不要(过多地)通过我们的 BizSpark 订阅。除了为我打算强调的(疯狂的)数量的潜在客户付出高昂的代价之外,我看不出应用程序应该在本地运行的任何理由......但是嘿......
    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多