2016年3月31日,星期四

Office 365性能– our Azure CDN 图片 演绎s solution

在上一篇文章中 图片 演绎s causing slow page loads in SharePoint Online,至少在目前,我谈到了Office 365 / SharePoint Online如何在图像和图像再现方面具有次佳的性能。许多人联系说他们也看到同样的问题。但是,我们是实施者-我们带来解决方案,而不是问题!所以在这篇文章中’我们将更详细地介绍如何解决此挑战,以及如何改善页面加载时间。

概括地说,该问题与SharePoint的图像再现功能有关。这是一项有用的功能,它可以在发布站点(例如Intranet)中自动创建图像的其他版本(大小)。但是,当用户点击包含这些图片的页面时-通常是首页或版块页面–并且需要下载它们,我们会看到最多3秒钟的延迟。显然,如果一个页面总共花了5到7秒钟来下载,那么这段时间是很大的一部分。令人惊讶的是,延迟不是通过导线发送给用户的实际图像。相反,分析显示在SharePoint Online中的服务器上发生了3秒左右的暂停–最可能是因为“cache misses”由于存在引渡框架’最初是为Office 365中使用的体系结构设计的。因此,该平台的性能不佳。’最佳-我们的解决方案是推出自己的演绎框架,而这篇文章介绍了我们所做的事情。

Using Azure to implement 演绎s

在深入研究实现之前,这里’上周我对流程的描述:

  1. Intranet作者在SharePoint中添加或更改图像
  2. 远程事件接收器执行,并将项目添加到Azure中的队列 (注意–RER并非具有故障安全性,因此我们通过一种后备机制来补充此方法,以确保不会发生损坏的图像。详情请见下文。
  3. Azure WebJob处理队列项目,采取以下步骤:
    1. 从SharePoint获取图像(使用CSOM)
    2. Creates different 演绎 sizes (using the sizes defined in SharePoint)
    3. 将所有结果文件存储在Azure BLOB存储中
  4. 然后,Azure CDN基础结构将映像文件传播到世界各地的不同Azure数据中心。
  5. 在SharePoint中显示图像时,将使用指向Azure CDN的链接(由对显示模板代码的细微调整提供)。由于CDN通过提供一个URL来工作,因此路由会自动进行,因此将获取与用户最近的图像副本。

对于那些感兴趣的人,让’进入主要元素:

远程事件接收器和关联的SharePoint应用程序/加载项

这里有两个元素:

  • 用于我们的远程代码(托管在Azure中)的SharePoint加载项,以验证回SharePoint
    • 我们使用AppRegNew.aspx注册此加载项,并指定将用于SharePoint身份验证的客户端ID和客户端密钥。
  • 远程事件接收器,用于检测何时添加新图像

这两个是相关的,因为我们使用Visual Studio模板将RER代码实现为提供程序托管的加载项(提供2个项目,一个用于应用程序包,一个用于应用程序网络)。实际上,该特定RER并没有’不需要与SharePoint通信 –当它触发时,它只是将一个项目添加到我们提前创建的Azure队列中。添加到队列中的对象包含刚刚添加或修改的图像的URL,我们使用Azure SDK进行调用。

我们将此RER应用于站点中需要解决方案的所有图像库。我们仅通过一次性遍历所有子站点的PowerShell / CSOM脚本将其作为一次性设置任务来完成,对于每个图像库,它都会发现它绑定了RER。我的帖子 在Office 365中的PowerShell脚本中使用CSOM 显示了一些类似的代码片段,我们对此进行了扩展。如果需要,可以按计划运行脚本,这样任何新的图像库都会自动运行“inherit” the event receiver.

Azure WebJob

主要工作在这里完成。该作业被实现为“continuous”在Azure中工作,我们使用 Azure队列触发器 轮询队列中是否有新项目。这是Azure中的基础结构,这意味着只要将新项目添加到队列中,我们的WebJob代码中的功能就会被执行– it’有效地是一个监视器。我们最初考虑使用BlobTrigger代替(并让RER本身将映像上传到Azure BLOB存储以方便此操作),但是我们没有’不喜欢BlobTrigger在处理中可能会有更大的延迟这一事实–我们希望事情尽快完成。此外,远程事件接收器在进行最少的处理工作时效果最佳–而且由于快速异步REST调用比复制文件字节轻得多,因此我们更喜欢这种模式。检测到新项目时,核心步骤为:

  1. Fetch details of the 默认 演绎 sizes defined in SharePoint for this site. This tends to 不 change too much, so we do some caching here.
  2. 使用对SharePoint的REST调用获取此图像的* specific *再现大小的详细信息。我们需要执行此操作以支持出色的演绎功能,该功能允许作者针对特定演绎内容专门放大/裁剪图像的一部分。– y’know, this thing:

    Image 演绎s - crop  图片

    If an author uses this feature to override the 默认 cropping for a 演绎, these co-ordinates get stored in the *file-level* property bag for the item, so that’是我们从中获取它们的地方。
  3. 从SharePoint图像库中获取实际图像。我们使用CSOM和SharePoint加载项身份验证进行此调用–我们的WebJob知道要使用的客户端ID和客户端密码。我们获取文件字节,即有效地将文件从Office 365下载到运行我们代码的位置(Azure),因为我们当然’将需要该文件才能创建其不同版本。
  4. For each 演绎 size needed:
    1. 将图像调整为这些尺寸,并遵守我们发现的任何X和Y起始坐标(如果作者确实覆盖了该图像的裁剪)。有很多方法可以处理图像大小调整,但是在评估了几个之后,我们选择使用流行的 图像处理器 库来做到这一点。
    2. 将每个文件上传到Azure BLOB存储。我们使用Azure SDK中的方法上载,并确保文件具有根据我们使用的URL约定的文件名–这很重要,因为我们的显示模板需要与此保持一致。

将文件上传到Azure BLOB存储后,’实际上是我们需要担心的。如果您使用Azure CDN,则自动使用存储在其中的文件’已经以某种方式配置了Azure CDN。一世’稍后将对此进行简要介绍。

Azure WebJob的身份验证

我认真思考了一下身份验证。最后,我们采用了SharePoint仅应用程序身份验证,但是我们还考虑了对远程代码使用Office 365 / Azure AD身份验证。坦白说’s my “default”这些天来,任何与SharePoint通讯的远程代码(假设我们’重新谈论Office 365)–正如将Office 365应用程序与SharePoint加载项进行比较中所讨论的,在大多数情况下,它具有许多优点,其中包括没有“installation”插件,身份验证流可以在SharePoint外部启动。

但是,使用SharePoint身份验证的优点之一是 我们不是’与使用与Office 365租户背后相同的Azure订阅/目录相关联。我们的客户可能并不总是能够提供支持,在这种情况下,这对我们很重要–使用这种方法意味着我们不’没有那种依赖性。

显示模板

如前所述,解决方案的很大一部分是确保SharePoint显示模板与CDN中的文件URL对齐。所以如果我们’重新使用汇总控件(例如网站周围的Content Search Web部件)以及这些参考格式图片,这些还需要“know the arrangement”. Effectively it’这是一个确保将文件放置在其中的事物和请求文件的事物都在交易中的问题(就了解URL的命名约定而言)。它’在这里,我们还实现了回退机制(稍后会对此进行详细介绍)来处理请求的图像不存在的任何情况。’t在CDN上找到。在将默认情况下,即从SharePoint获取图像的默认行为换成从CDN获取图像的行为,这取决于如何在SharePoint中使用值<img src>获得属性:

<img src="_#= imgSrc =#_" />

只需实现一个函数即可根据您的URL约定获取该值,然后您’好。尽管未在上面的代码段中显示,’在这里,我们的后备机制被称为‘onerror’ handler on the <img> tag.

WebAPI

因为我们’在谈论建筑作品’还有一些WebAPI– this is part of 后备机制, described later.

Azure CDN配置

如前所述,使用Azure可以轻松实现CDN部分。当文件上传到Azure BLOB存储时,它将获得以下形式的URL:

http:// _ [MyAzureContainer] .blob.core.windows.net / MyImage.jpg

..但是如果您配置CDN,也可以通过以下方式访问它:

http:// _ [MyCDNEndPoint] .azureedge.net / MyImage.jpg 

使用后一个URL时,实际上将从最近的Azure CDN数据中心向用户请求文件。如果文件没有’如果尚未传播到该位置,则要路由到该位置的第一个用户将强制将文件缓存在那里,供该地理区域中的其他用户使用。我们的测试发现,这种额外的延迟很小。 CDN需要考虑的事情比我还多’我会在这里详细介绍,但是初始配置很容易–只需在Azure中创建一个CDN配置,然后指定它由Azure存储支持,然后选择您要在其中使用的容器’重新放置您的文件。下图显示了此过程:

 图片

从BLOB存储创建CDN端点

后备机制

所以我提到了几次我们所说的“后备机制”。我一直很担心我们的解决方案有时会导致图像损坏–我只是可以想象,这将是关于CEO的一些重要新闻文章,对于我们的一位客户而言,是重要的一天。幸运的是,我们能够实施似乎很好的保护层。简而言之,我们“intercept”使用HTML 5损坏的图像‘onError’ callback for the <img>标签。如果图像不存在则触发’出于任何原因而在CDN上被发现,这启动了我们的机制,该机制有两个作用:

  1. Substitutes the 原版的 演绎 图片 from SharePoint -这意味着我们’re “back to the 原版的 situation”, and we haven’没有使任何事情变得更糟。
  2. 对我们的WebAPI服务进行后台异步调用 –这会将一个项目添加到Azure中的队列中,这意味着图像将在下次处理。这与RER针对此特定文件触发的情况相同。

下图显示了发生的情况(单击放大):

CDN  图片  演绎s - fallback mechanism 2

关于此机制的一件好事是它适用于站点中的现有图像。因此,如果该机制是在具有大量图像的现有站点中实现的,’不用转转“touching”每个图像触发远程事件接收器。取而代之的是,所有需要发生的事情就是让某人在站点周围浏览,并且图像将根据请求迁移到CDN。

我们遇到的挑战

一路上,我们面临着一些挑战,或者至少要考虑一些事情。这里的快速列表包括:

  • 考虑来自Azure CDN的缓存标头,缓存过期等–这与作者可以在SharePoint中更新图像而不更改文件名的方案有关。显然,最终用户浏览器可以缓存该图像(最终用户可以’不能仅仅因为您就按CTRL F5进行硬刷新’ve更新了文件!)。我的同事 保罗·瑞安 为此写了一篇很棒的文章 Azure CDN与SharePoint集成,缓存控制标头max-age,s-maxage
  • 并行上传到Azure(例如’重新为找到的图片创建8种不同的尺寸,也可以并行上传!)
  • 确保我们了解如何处理不同的环境(具有不同Azure订阅的开发/测试/生产租户)
  • 实施一个不错的日志记录解决方案
  • 测验

概要

正如我上次总结的,如果Office 365中的原始性能问题没有’不会发生。但是CDN一直在优化网站性能方面一直很有用,在许多方面我们’这样做是在扩大微软’Office 365背后CDN的现有使用。AzureWebJobs,Azure文件存储,CDN,SharePoint加载项,远程事件接收器,WebAPI等构建模块意味着Office 365 / SharePoint Online平台可以进行各种扩展适当的方式。这是为以下客户开发的解决方案 内容和代码 所以’我无法提供源代码,但是希望这两对文章有助于您了解问题的一种解决方法以及体系结构的详细信息。

2016年3月22日,星期二

Office 365性能– 图片 演绎s causing slow page loads in SharePoint Online

就像任何网站一样,在SharePoint Online中页面加载时间可能并不惊人的原因有很多。也许吧’一页太多‘heavy’控件(例如搜索Web部件),特别慢的自定义控件,在线传输的数据量(例如由于大图像的JavaScript / CSS文件),使用已知的性能杀手(例如结构导航),或者速度很慢由于诸如反向代理之类的网络基础架构而使办公室运行缓慢,因此可以从办公室中删除。如果用户远离Office 365租户所在的位置,那肯定会加剧情况。与往常一样,如果网站具有任何类型的自定义,则需要采取一些优化步骤-可以获得良好的性能’总是默认情况下发生。但是最近,我们’我们注意到,即使在以下情况下,页面加载速度仍然很慢:

  • 我们优化的网站
  • 开箱即用的发布网站

Analysis showed that the issue was related to 图片 演绎s in SharePoint. If you’对此功能不熟悉,它做了一些有用的事情,具有讽刺意味的是,它旨在提高网站性能。对于每个上传的图像,多个 调整大小 版本会在后台自动创建–这个想法是最终用户不要’t download a large ‘original’仅需要很小的缩略图时的图像。经典示例是将大图像添加到内容页面,然后将其显示为主页上的上卷链接列表,例如“最新新闻文章”.

如果不是’对于性能问题,原理很好–对于一个典型的大小,一个4MB的图像通常会缩小到200k左右,并且’s a 很多 更少的数据下载给用户。一世’我不确定最近在Office 365中是否进行了任何更改(因为大多数网站’ve been involved in use 图片 演绎s), but a couple of clients 不 iced the issue around the same time we did. Specifically, pages with 演绎s are slow on “first-time” page loads 也就是说,由于本地浏览器缓存中没有提供图片而需要下载图片时。但不幸的是’s 不 just that - 演绎 图片 files are served with expiry headers of 24 hours, meaning 即使是普通用户,每24小时也将至少有一个非常缓慢的页面加载。当然,我们可能不仅在谈论他们的主页– rather, 每一个 每24小时一次,他们点击的网页可能会变慢。那’肯定足以破坏用户对Office 365的认识。

边注– 第一次 page loads vs. returning user page loads
因此,即使在首次加载页面时,翻译也很慢。但是当我们’关于这个主题,我们无论如何需要关心首次页面加载?我通常建议我的客户不要太担心–坦率地说,Office 365在这里总是很慢,因为需要下载一些非常繁琐的JavaScript文件(即使它们确实来自CDN)。它’毕竟是一个功能丰富的平台。但这是Office 365设计的很大一部分–我相信Microsoft认为用户会宽恕,只要他们的*“后续”浏览体验很快即可。大多数用户不’对企业内部网/协作平台的期望与对公众消费网站(如Facebook和Google)的期望相同–而且由于大多数Intranet的使用都是*不是*首次页面加载,因此最终效果良好。我坦率地同意这一观点。

But why are 图片 演绎s slow?

当执行进一步分析时,我们看到延迟发生在服务器上–最大的惊喜是延迟是 要下载的实际图像,这就是您’d通常期望。下图显示了一个正在加载的真实主页,我们可以看到许多图像都有几秒钟的延迟(每个图像都是一个“rendition”图片),如绿色长条所示:

渲染图像延迟_小

当我们深入研究时,我们看到延迟不是在内容下载中,而是在“waiting” stage –这表明延迟与Office 365本身有关,并且 在实际下载的文件中:

渲染图像延迟-detail_Small

我们认为,发生这种情况是因为通常“cache misses”从BLOB缓存提供的演绎图像上。当不从Blob缓存中提供图像时,SharePoint Online基础结构处理和提供图像的速度非常慢。看来快取 命中 对于最终用户来说非常罕见–可能部分是由于SPO中的BLOB缓存设置(例如,允许的磁盘大小),但更有可能是由于典型SPO服务器场中的前端服务器数量过多。一世’m告诉我们,该服务中的一些较大的服务器场现在具有100到200个前端服务器–显然,这与SharePoint最初设计用于的本地环境完全不同。因此,尽管演绎体系结构在一个典型的本地部署服务器场(例如3-6个前端Web服务器)中将非常有效,但在Office 365世界中并非如此。当然,如果您与产品紧密合作,有时会看到一些类似的事例,’完全可以完美地转换为云世界。话虽这么说,但我曾参与过许多部署’我总是对SharePoint作为一项服务的工作表现感到惊讶(毫无疑问,这是由于有才华的Microsoft工程师(包括我认识的一些人)的辛勤工作)-但总会有“改善的机会”,并且服务通常会演变为包括这些内容。

我们的解决方案(基于Azure CDN)

那么我们能做些什么呢?好吧,我们可以避免完全使用SharePoint图像副本,但是由于将大文件下载给用户,因此性能仍然很差。所以我们一定要使用不同的图像尺寸–由于调整图像大小的核心工作是’这么辛苦,为什么不自己做呢?然后,我们可以利用其他优势,例如自动使用CDN,例如 Azure CDN (注:该链接说明了CDN在您进行’不熟悉)。这是我们解决SharePoint Online性能问题的方向。事情进展顺利,我们实现的好处如下:

  • The Office 365 演绎s delay does 不 occur
  • 对Intranet最终用户没有影响(改进的性能除外)
  • 内联网作者不需要做任何其他事情或接受其他培训
  • 图像文件托管在Azure CDN(内容交付网络)中,该文件将文件放置在世界各地的各个Azure数据中心中,以确保它们与用户接近。对于某些用户,尤其是远离Office 365数据中心的用户(例如,对于大多数客户而言,非欧洲用户),这可以显着提高性能。
  • All of the capabilities of the 图片 演绎s framework are supported (e.g. the ability for an author/administrator to crop an 图片 演绎 so that a certain 一部分 图片的使用)

技术一我们的解决方案架构

I’在下一篇文章中将进行更详细的介绍,但简要地讲,我们的解决方案如下:

  1. Intranet作者在SharePoint中添加或更改图像
  2. 执行远程事件接收器,并将项目添加到Azure中的队列 (注意–RER并非具有故障安全性,因此我们通过一种后备机制来补充此方法,以确保不会发生损坏的图像。下次有更多内容)。
  3. Azure WebJob处理队列项目,采取以下步骤:
    1. 从SharePoint获取图像(使用CSOM)
    2. Creates different 演绎 sizes (using the sizes defined in SharePoint)
    3. 将所有结果文件存储在Azure BLOB存储中
  4. 然后,Azure CDN基础结构将映像文件传播到世界各地的不同Azure数据中心。
  5. 在SharePoint中显示图像时,将使用指向Azure CDN的链接(由对显示模板代码的细微调整提供)。由于CDN通过提供一个URL来工作,因此路由会自动进行,因此将获取与用户最近的图像副本。

如下所示:

CDN  图片  演绎s for SPO

后备机制

显然’对于Intranet主页从不显示损坏或丢失的图像至关重要–对于大多数组织而言,这将是一件非常糟糕的事情。那么我们如何防范呢?另外,我们说远程事件接收器不能100%可靠(也不应这样做)“heavy”处理工作),所以…..那个怎么样?在实施此类解决方案之前正在运行的站点中的现有映像又如何呢?我的同事 保罗·瑞安 当我设计解决方案并编写代码时,我努力应对了这些挑战以及更多挑战-我’ll talk more about 后备机制 (which takes care of these aspects) and go into more detail on the technical implementation in the next post. 

概要

如果这个问题没有发生,那就太好了’当然,它首先存在于Office 365中。但是我写这篇文章是为了表明,有了正确的构建块,我们当然可以付出一些努力来补充Office 365 / SharePoint的功能。这是为以下客户开发的解决方案 内容和代码 所以’我无法提供源代码,但是希望本文可以帮助您了解该问题以及解决该问题的潜在方法。下次更多