技术速递|使用 .NET 为 Microsoft AI 构建可扩展网关

作者:Kara Saucerman
排版:Alan Wang

Microsoft AI 团队构建了全面的内容、服务、平台和技术,以便消费者在任何设备上、任何地方获取他们想要的信息,并为企业改善客户和员工的体验。我们的团队支持多种体验,包括 Bing、Copilot、广告、地图和 Edge,并通过 Edge 新标签页、Windows 10 和 11 等入口点呈现,这些入口点每月有超过 10 亿活跃用户。我们意识到需要一个高性能且可靠的网关作为 Microsoft AI 的前端和入口层。这将使多个团队能够利用我们开发的通用功能来帮助运营业务并专注于客户体验和功能。在本文中,我们将介绍在 .NET 8 上借助 YARP 构建网关(代号为 CETO)的过程。
在这里插入图片描述

反向代理

在开始编写 CETO 之前,我们必须决定使用反向代理。我们应该使用外部的还是尝试自己制作?这些外部的能涵盖我们所有的用例吗?我们还必须考虑定制这些代理的高成本和持续维护。我们的需求包括支持 HTTP/2、HTTP/3、WebSocket 等流协议、简单的可扩展性等等。当我们开始了解 Microsoft 其他内部团队正在做的事情时,我们遇到了 YARP 项目。YARP 代表:“又一个反向代理”。该项目使用 ASP.NET 和 .NET(.NET 6 及更高版本)提供一个灵活的解决方案,可以通过 .NET 代码进行修改。这有多方便呢?事实证明这正是我们所需要的。

Bing 运行着世界上最大、高性能且可靠的 .NET 应用程序之一。我们依赖于与 .NET 团队的密切合作关系,并且是每个 .NET 版本的早期采用者。通过尝试并升级到每个新版本,我们可以向 .NET 团队提供有用的反馈。这有助于我们的平台和那些将升级服务以使用这些新版本的外部客户。我们将 YARP 纳入该反馈周期。

在现代 .NET 上创建新服务

由于 CETO 是一项新的服务,我们当时有机会使用最新的.NET版本。如今,它构建在 .NET 8、Kestrel + YARP 2.1 之上,可以在多个基础设施平台和数千台服务器上运行,既支持Linux容器也支持Windows容器。跨平台运行的能力增加了我们模块的可移植性和兼容性,以及在任何地方部署的灵活性和效率。在这个层面上的性能非常快,每一毫秒都至关重要。CPU%较低,从而降低了运营成本。

CETO 通过统一我们平台上的业务逻辑来实现融合,然后将请求交给 YARP,以完成路由到适当上游服务的繁重工作。我们希望我们的路由和映射能够高度定制化,因为我们要处理许多具有不同流量模式的不同群体,这会影响其他关键功能。

灵活性至关重要

我们对如何使用 .NET 和 YARP 有很多选择和控制权,因为它们非常灵活且功能多样。.NET提供了各种各样的API,以满足不同的需求,例如配置、依赖注入、日志记录、测试和调试等。通过使用 .NET,我们的 CETO 开发人员可以编写灵活、易于维护的代码,无缝连接到我们的其他服务。

我们采取了以下几种方法来满足我们的需求:

我们希望从一个中心位置管理我们内部团队的客户流量路由和目的地。使用 YARP,我们可以通过提供几个实现 IProxyConfigProvider 和 IProxyConfig 接口的类来选择从外部加载配置。团队可以创建任意数量的简单或复杂的路由,并与其他团队分开部署。更改会在后台重新加载,然后我们用新的快照交换代理配置状态,通知旧的配置已过时。

由于使用完整的 YARP 代理,我们具有路由和负载平衡的优势。我们希望提供一个选项,当从服务收到某些 http 状态代码时,转发到另一个位置。团队可以在 YARP 路由配置的 IReadOnlyDictionary<string, string> 元数据部分中设置此配置。我们在响应返回到客户端之前对其进行检查,从匹配的路由中获取元数据,然后使用 direct IHttpForwarder 将请求转发到另一个位置。通过使用 IHttpForwarder,我们仍然可以获得这些请求的错误处理、流协议和 http 客户端定制。

YARP 有多种默认的负载均衡策略,适合大多数场景。我们不需要修改这些策略的目标选择,而是干预选择过程并做一些其他事情。从 ILoadBalancingPolicy 创建一个新策略并利用目标属性中的 IReadOnlyDictionary<string, string> 元数据,我们可以对特定目标进行分类以用于其他目的。
在这里插入图片描述
在这种情况下,我们希望将一定比例的请求镜像到不同的目的地。流量镜像或流量阴影用于将生产流量重播到测试环境中,而不影响最终用户体验。请求被克隆并发送到队列进行处理,同时我们继续正常的选择逻辑,为请求选择可用的目标(不是镜像类型)。

.NET 速率限制是另一个便于使用的功能。它具有使用 PartitionedRateLimiter 的选项,可以基于任何唯一的 UserId 或其他标识符设置速率限制策略。我们通过使用 YARP RouteId 作为密钥的一部分来实现每个路由的速率限制。这些路由的所有者可以直接在 YARP 路由配置(元数据部分)中指定他们的许可值,并将其传递给速率限制器扩展。该密钥被创建为 routeId + 唯一标识符,以便当团队更新其许可限制时,我们会生成一个新密钥。限速库可以自动获取这些信息,无需重启服务。如果策略已经存在,速率限制将不会更新权限限制,因此我们创建一个新密钥。库会在大约 30 秒后删除过时的策略。这使我们可以保护每条路由的服务并有能力在单一位置管理我们团队。

大多数 CETO 配置使用 .NET 中的 Configure 和 IOptionsMonitor 接口以及 Json 配置提供程序。IOptionsMonitor 接口用于检索选项并管理 IOptions 实例的选项通知。

配置是通过我们的自定义服务扩展 AddSingletonServiceConfig 添加的,该扩展使用 ConfigurationBuilder 按顺序加载(以最后加载的键为准):

  • 默认值 services.Configure(serviceConfig.GetSection(“Default”));
  • 环境组值 services.Configure(serviceConfig.GetSection(environmentAlias));
  • 每个环境值 services.Configure(serviceConfig.GetSection(environmentName));

然后将配置添加到接收 IOptionsMonitor 的单例 IConfigurationReader 中。

简单示例:
在这里插入图片描述
在环境 2(生产组的一部分)上启动服务时,会产生以下配置:

"ModuleA": {"SSLCertificateSecretIdentifier": "ProdCert","PollingIntervalInSec": 30
},

当模块所有者想要添加新配置时,他们会创建一个新的模式模型作为 C# 类,添加 Json 配置文件,并更改 CETO 以调用我们的服务扩展。他们的类现在通过依赖注入接收特定于运行时的配置。由于我们使用 IOptionsMonitor,它还支持更改通知的功能。

性能很重要,.NET 8 速度更快

我们始终对我们的服务表现负责。随着服务所有者不断增加功能数量,延迟时间可能会逐渐增加。每个 .NET 版本都带来了性能改进。我们很高兴能够免费升级并获得这些性能改进。然而,我们仍然需要定期分析我们的服务,以确保我们明智地使用我们的资源。对于我们的开发人员来说,阅读开发博客文章以获取有用的提示非常有用。

展望未来

通过使用现代 .NET 及其功能,我们能够毫不费力地为我们的组织创建一个有效且高质量的网关。我们展示了几个示例,说明如何轻松扩展 .NET 库以满足我们组织的需求。我们对未来的 .NET 版本以及我们与 .NET 团队的持续合作充满期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/833201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MapReduce的Shuffle过程

Shuffle是指从 Map 产生输出开始,包括系统执行排序以及传送Map输出到Reduce作为输入的过程. Shuffle 阶段可以分为 Map 端的 Shuffle 阶段和 Reduce 端的 Shuffle 阶段. Shuffle 阶段的工作过程,如图所示: Map 端的 Shuffle 阶段 1&#xff09;每个输入分片会让一个 Map 任务…

【探索Java编程:从入门到入狱】Day4

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台

YoloDeployCsharp|基于.NET Framework的YOLO深度学习模型部署测试平台 1. 项目介绍2. 支持模型3. 时间测试4. 总结 1. 项目介绍 基于.NET Framework 4.8 开发的深度学习模型部署测试平台&#xff0c;提供了YOLO框架的主流系列模型&#xff0c;包括YOLOv8~v9&#xff0c;以及其系…

MySql数据库(概念篇)

数据库概念 什么是数据库 数据库见名之意&#xff0c;就是用来存储数据的仓库&#xff0c;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 没接触数据库之前&#xff0c;一般都是将数据存储在文件中。比如execl文件&#xff0c;word文件中。但是…

基于SpringBoot的饭店外卖平台的设计与实现

项目描述 这是一款基于SpringBoot的饭店外卖平台的系统 模块描述 用户端 登录 首页 商家信息 点餐 菜品列表 下单 订单列表 账号下单列表 个人中心 个人资料 修改信息 评论管理 评论菜品 查看评论 打赏骑手 打赏骑手 管理员 登录 菜品管理 修改 下架 订单列表 下单记录 菜品管理…

nginx 负载均衡、反向代理实验

nginx 负载均衡、反向代理实验 实验目的 理解概念&#xff1a;明确反向代理和负载均衡的基本概念及其在网络架构中的作用。 掌握技能&#xff1a;学习如何配置Nginx以实现反向代理和负载均衡功能。 实践应用&#xff1a;通过实际操作&#xff0c;体验Nginx如何提升Web服务的可…

LeetCode406:根据身高重建队列

题目描述 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数…

TinyXML-2介绍

1.简介 TinyXML-2 是一个简单、小巧的 C XML 解析库&#xff0c;它是 TinyXML 的一个改进版本&#xff0c;专注于易用性和性能。TinyXML-2 用于读取、修改和创建 XML 文档。它不依赖于外部库&#xff0c;并且可以很容易地集成到项目中。 tinyXML-2 的主要特点包括&#xff1a…

远程工作的数据安全挑战和解决策略

随着远程工作的普及&#xff0c;数据安全面临了前所未有的挑战。企业在应对这些挑战时&#xff0c;必须采取切实有效的策略来保护敏感信息。以下是远程工作数据安全的主要挑战和相应的解决策略&#xff1a; 数据安全挑战 设备丢失或被盗&#xff1a;员工在外工作时&#xff0c…

ldap对接jenkins

ldap结构 配置 - jenkins进入到 系统管理–>全局安全配置 - 安全域 选择ldap - 配置ldap服务器地址&#xff0c;和配置ldap顶层唯一标识名 配置用户搜索路径 - 配置管理员DN和密码 测试认证是否OK

AIGC技术带给我们什么?基于AIGC原理及其技术更迭的思考

AIGC技术带给我们什么&#xff1f;基于AIGC原理以及技术更迭的思考 前言 AI&#xff0c;这个词在如今人们的视野中出现频率几乎超过了所有一切其他的事物&#xff0c;更有意思的是&#xff0c;出现频率仅次于这个词的&#xff0c;几乎都会加上一个修饰亦或是前缀——AI&#…

ROS机器人实用技术与常见问题解决

问题速查手册&#xff08;时实更新&#xff09;更加全面丰富的问题手册记录 1.机器人使用GPARTED挂载未分配空间 需要在图型界面下操作&#xff0c;建议使用no machine连接 安装gparted磁盘分区工具, sudo apt-get install gparted -y 启动软件 sudo gparted 点击磁盘/内存…

如何使用vue脚手架创建项目

前言 使用vue搭建项目的时候&#xff0c;我们可以通过对应的cmd命令去打开脚手架&#xff0c;然后自己配置对应的功能插件 说明&#xff1a; 要使用Vue脚手架创建项目&#xff0c;你需要先确保你已经安装了Node.js和npm&#xff08;Node.js的包管理器&#xff09;。然后&#…

热敏电阻怎么进行性能测试?并以LabVIEW为例进行说明

过程也可用于执行热敏电阻测量。RTD和热敏电阻遵循非常相似的功能原理&#xff0c;测量步骤与下面提供的步骤相同。有关热敏电阻的更多信息&#xff0c;请参阅本文档。 查找设备引脚排列 在连接任何信号之前&#xff0c;请找到您的设备引脚排列。 打开NI MAX并展开设备和接口。…

视频素材库在哪里找免费手机版?8个可以用手机浏览的素材网

在视觉内容占据主导地位的今天&#xff0c;合适的视频素材可以大大提升项目的吸引力和效果。以下列出的视频素材网站为广告制作者、社交媒体策略师及电影制作人提供了从传统到现代风格的各种视频素材选择&#xff0c;满足不同的创作需求。 1. 蛙学府&#xff08;中国&#xff…

PyGame 文字显示问题及解决方法

在 Pygame 中显示文字时可能会遇到一些问题&#xff0c;例如文字显示不清晰、字体不正确或者文字位置不准确等。以下是一些常见的问题及其解决方法&#xff0c;具体情况可以看看情况。 1、问题背景 一位用户在使用 PyGame 库进行游戏开发时&#xff0c;遇到了一个问题&#xf…

服务器关机前未退出xampp导出MySQL无法启动

背景解决 五一放假&#xff0c;服务器关机了&#xff0c;但是关机前没有正常关闭数据库服务&#xff0c;导致数据库无法启动&#xff01; 查看错误日志如下 从报错信息可以看出是MySQL这个服务相关文件出现问题了&#xff0c;解决思路&#xff1a;重新安装xampp 重新安装xam…

automa警惕通过点击元素打开新的标签页,因为你可能会被他蒙蔽!

大家好&#xff0c;我是大胡子&#xff0c;专注于研究RPA实战与解决方案。 我们经常用到automa里面的【点击元素】组件&#xff0c;但要警惕通过点击元素打开新的标签页&#xff0c;例如下面这个场景&#xff0c;点击公众号的图文消息&#xff0c;之后&#xff0c;要自动输入标…

self-attention 的 CUDA 实现及优化 (上)

self-attention 的 CUDA 实现及优化 (上) 导 读 self-attention 是 Transformer 中最关键、最复杂的部分&#xff0c;也是 Transformer 优化的核心环节。理解 self-attention &#xff0c;对于深入理解 Transformer 具有关键作用&#xff0c;本篇主要就围绕 self-attention 展…

QT--2

Qt界面设计 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口相关设置this->resize(680,520);this->setFixedSize(680,520);this->setWindowTitle("Tim");this->setWindowFla…