原文链接 https://devblogs.microsoft.com/dotnet/bing-ads-campaign-platform-journey-to-dotnet-6/

广告组件平台对于微软搜索平台能给用户提供好的用户体验至关重要,这个平台支持超过450000个广告商允许他们创建广告。

在一秒钟内,该平台处理数千个web请求,而且时延不超过100毫秒。

支撑这个平台的是几十个分布式服务,现在这些服务都要构建在.net 6 之上,运行在微软自己的AKS云服务的Linux容器中。

要实现这一目的其实并不容易,博文后面部分就介绍多年来我们将代码升级到.net 6所面临的挑战以及如何解决的。(注意:.net core 现在已经统一到.net 平台,这里提到.net 都指.net core,如果是.net framework 会明确指出)

代码仓库概述

我们有超级多的代码,光c#项目就超过600个,一下就是分解以后的代码占比图

我们有超过800万行代码,其中c#超过了700万行,统计代码行数虽然不能说明代码仓库的全部,但是可以给出一个粗略的印象我们有多大的工作量要搞。在这超过600多个的项目中,我们引用了500多个不同的nuget包,而且很多依赖项会对迁移产生影响。

我们的出发点

多年来我们的服务发生了很大的变化,而且托管他们的基础设施也发生了巨变,从物理机到云服务。以前我们是在windows服务托管在iis上,此外我们还有大量服务构建使用wcf,这是问题的复杂所在。所以最开始我们的迁移只是从物理机的windows服务迁移到了云上的windows 虚拟机,仍然是windows-only。

为什么迁移到.net(.netcore)

为什么我们要花费两年多时间从.netframework -.net 我们的技术团队给出了以下理由:

跨平台

好处很明显,不用跟windows绑定了。

.Net  代表未来

.net framework 4.8 是计划更新的 最后一个版本,很多新的特性,以及性能优化的创新都只能在.net 上可用,坚持.net framework 死路一条。

开源

更好用的工具

dotnet cli 工具无需IDE借助命令行终端就可以完成很多工作,其他的感觉不是工具,就不列举了。

我们的迁移过程

对于类库:

.NET Framework 4.6 -> .NET Framework 4.7 -> .NET Standard 2.0

对于应用:

.NET Framework 4.6 -> .NET Framework 4.7 -> .NET Core 3.1 -> .NET 5 -> .NET 6

.NET Standard

简单理解这是一个提供了一部分公共api抽象的定义,在.net framework 跟.net 会有相应的实现。

挑战

主要是我们依赖的那500多个包如果更新了会有很多break changes,比如Unity这个IOC库,支持 .NET Standard 的可用版本已经完全重写了其 API,我们必须更新数万行代码才能与这些更改兼容。

绑定重定向地狱

WCF

我们重度依赖 WCF,超过45 个服务构建在wcf之上,但是现在普遍看法是基于REST的服务是未来,但是我们不能这样,因为我们有无数个现有客户大量构建在这些 WCF 服务之上,并使用我们的 SDK 直接调用它们,告诉我们的付费客户,嘿,你得用GRPC这类新东西冲洗你的客户端,这显然不现实,所以这是一个大问题。

解决问题

不兼容的Nuget 包

这个最需要花费时间了,对于开源的不支持.net standard 的我们在内部自己打一个补丁包使得支持,对于不开源的我们也会选择反编译使得与.net standard 兼容。

绑定重定向问题

WCF

最终,微软决定针对.Net d的wcf有限子集开源Core wcf捐献给开源社区。CoreWCF 对来自传统 WCF 的 System.ServiceModel 命名空间的许多现有类型使用全新的命名空间,因此转换现有服务并非易事。此外,我们的代码库中使用了如此广泛的通用代码,以至于我们需要在转换过程中支持在 CoreWCF 服务和 .NET Framework 服务中运行该代码。我们最终使用multi-targeting (在代码中可以使用条件编译指定不同平台实现不同代码,在工程文件中指定目标平台使用TargetFrameworks,这样可以指定多个)来实现这一目标。过程很艰辛,单总算迁移完了,所以如果您需要托管 SOAP 服务并且想要在 .NET 6 上运行所带来的高性能,那么 CoreWCF 是一个很好的答案。

结果

性能层面

值得吗?做了这么多答案是肯定的。这图显示了我们的一项服务的延迟改进,这仅仅是由于将其更改为目标 .NET 并重新编译。

这甚至没有任何新的功能做任何优化,这些都是.net 团队做的运行时级别的改进,下图是另一个例子,我们迁移到Core wcf 以后内存使用情况

现代服务架构

除了这些明显的性能优势之外,进入 .NET 为我们提供了从 IIS 和 Windows 迁移到在 AKS 中托管的 Linux 容器内运行的 Kestrel 服务器的机会,我们现在可以使用所有可用于管理和配置云服务的现代化工具和资源(比如K8s)

总结

对于计划将大型现有 .NET Framework 代码库迁移到 .NET 6 及更高版本的其他人,可以应用从我们的经验中吸取的教训:

1. 现有代码从4.7 升级到4.8

2. 将所有项目迁移到新的 SDK 格式,以便它们在执行任何其他操作之前使用 PackageReference。(说实话我忘了.net framework 是咋回事了,所以上面这块儿原文也没怎看就没翻译)

3. 使用 .NET Standard 作为桥梁,允许在迁移过程中在 .NET Framework 和 .NET 项目之间共享库代码

4. 使用集中的包引用来极大地简化向较新 NuGet 包的过渡。

迁移完成了,我们的脚步并没有停下,接下来我们会研究.net的一些新的特性:

1. 找到我们可以使用 Span\<T> 来减少堆分配并提高性能的地方,例如,我们的代码有一些地方可以检查两个字节缓冲区是否相同。我们可以使用高度优化的 SequenceEqual 方法,而不是遍历每个字节并测试相等性

```return bufferA.AsSpan().SequenceEqual(bufferB);```

以下是benchmark

随着我们的前进,重写我们的一些代码以专门利用新的语言和运行时特性,这将继续是一项有趣且非常有益的练习

Bing 广告平台迁移到 .net6的更多相关文章

  1. Windows C盘格式化或者同平台迁移oracle数据库

    我们知道如果是Linux 同平台迁移oracle数据库.只要是安全关闭了数据库,在新机器上创建用户组,配置了环境变量,将数据库安装目录拷贝到对应的目录就好用了. 一直在寻求Windows平台上这类的解 ...

  2. 晒下自己App广告平台积分墙收入,顺便点评几个广告平台

    这是我之前发在爱开发App源码论坛的文章.分享了我从2011年到现在移动广告方面的收入和一些心得. 产品类型:FC.街机模拟器类App游戏 广告平台:万普世纪 广告形式:积分墙,用户先试玩几次,再玩需 ...

  3. android广告平台介绍

    广告模式:   广告条:最普遍的广告模式,嵌入在应用界面内,用户点击行为会带来收入.   积分墙:应用通过限制功能.去广告等引导用户进入积分墙页面下载广告应用得到积分来换取使用的模式,用户安装完推荐广 ...

  4. Android应用盈利广告平台的嵌入方法详解

    一.如何学习Android  android开发(这里不提platform和底层驱动)你需要对Java有个良好的基础,一般我们用Eclipse作为开发工具.对于过多的具体知识详细介绍我这里不展开,我只 ...

  5. App如何选择移动广告平台的开发者3 - 选择标准广告平台

    App开发公司.通常他们不能走品牌.要挑品牌的能力,我们将面临两大问题:业务团队.广告填充率.一系列的问题,以现金周期. 无线商务本才刚刚开始,大多数都是没有商业经验.产品.设计.运营.销售的人才都不 ...

  6. Linux 工程向 Windows 平台迁移的一些小小 tips

    Linux 工程向 Windows 平台迁移的一些小小 tips VS2013 C++11 Visual Studio 2013 没有做到对 C++11 所有的支持,其中存在的一个特性就是 In-cl ...

  7. 20130501-Twitter向全美用户开放广告平台Twitter Ads

    腾讯科技讯(晁晖)北京时间5月1日消息,据国外媒体报道,Twitter今天向所有美国用户开放了广告平台Twitter Ads.自2012年3月发布以来,Twitter Ads只向受邀请用户开放.Twi ...

  8. 实时竞价RTB广告平台_传漾科技_中国领先的智能数字营销引擎

    实时竞价RTB广告平台_传漾科技_中国领先的智能数字营销引擎 Programmatic Framework™ 传漾程序化购买框架

  9. Cocos2d-JS 项目接入 触控广告平台(基于anysdk2.0.2)

    本文以Cocos2d-JS项目作为示例,讲解如何集成AnySDK-JS. 一.如何创建项目我就省略了,直接进入主题. 1.1 首先,我需要下载anysdk框架包,下载地址:http://www.any ...

随机推荐

  1. SpringBoot使用CORS的addCorsMappings中会遇到的问题

    跨域需要后端需要设置响应的跨域头 如下 public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/ ...

  2. 日夕如是寒暑不间,基于Python3+Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_220 定时任务的典型落地场景在各行业中都很普遍,比如支付系统中,支付过程中因为网络或者其他因素导致出现掉单.卡单的情况,账单变成了 ...

  3. JS 字符串转 GBK 编码超精简实现

    前言 JS 中 GBK 编码转字符串是非常简单的,直接调用 TextDecoder 即可: const gbkBuf = new Uint8Array([196, 227, 186, 195, 49, ...

  4. 在生鲜零售业,DolphinScheduler 还能这么玩!

    点击上方 蓝字关注我们 ✎ 编 者 按 2021 年,Apache DolphinScheduler 社区又迎来了新的蓬勃发展,社区活跃度持续提高.目前,项目 GitHub Star 已达 6.7k, ...

  5. 红黑树以及JAVA实现(一)

    目录 前言 一. B树 1.1 概念 1.2 2-3-4树 1.3 2-3-4树的插入 节点分类 1.4 2-3-4树的删除 1.4.1 当删除节点是叶子节点 1.4.1.1 当删除节点为非2节点 1 ...

  6. Excel 工作簿、工作表与单元格

    工作簿 工作簿是指在 Excel 中用来存储并处理数据的文件,其扩展名是.xlsx.工作簿是由工作表组成的,每一个工作簿都可以包含一个或多个工作表,默认为 3 个工作表.Excel 2007 之前的版 ...

  7. python爬虫之BeautifulSoup4使用

    钢铁知识库,一个学习python爬虫.数据分析的知识库.人生苦短,快用python. 上一章我们讲解针对结构化的html.xml数据,使用Xpath实现网页内容爬取.本章我们再来聊另一个高效的神器:B ...

  8. 来开源吧!发布开源组件到 MavenCentral 仓库超详细攻略

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  9. day31-线程基础01

    线程基础01 1.程序 进程 线程 程序(program):是为完成的特定任务,用某种语言编写的一组指令的集合.简单来说,就是我们写的代码. 进程: 进程是指运行中的程序,比如我们使用QQ,就启动了一 ...

  10. kingbaseES R3 集群配置 SSL

    ​ 案例说明: 本测试是在非生产环境下,在官方没有明确声明支持KingbaseCluster使用ssl的前提下,建议只能在测试环境使用,避免生产环境下直接使用. 数据库版本: TEST=# selec ...