无服务器函数并发的本地模拟

2025-06-10

无服务器函数并发的本地模拟

《Wing Inflight》杂志第 9 期。

我很高兴与大家分享另一期《Wing Inflight Magazine》,其中包含有关Winglang
项目 的最新更新和新闻

那么 Wing 又是什么?

Wing是一个全新的云端编程环境。它使开发者能够轻松构建和测试分布式系统,并充分利用各种强大的云原语,例如队列、主题、API 端点、存储桶、网站、主题以及不断壮大的 Winglib 生态系统

Wing 带有一个可视化云模拟器,可用于在本地机器上与完整的云应用程序进行交互和测试,具有快速热重载功能,无需将单个
资源部署到云中。

Wing 的独特功能之一是它支持我们所说的可插拔平台
提供商
。这意味着应用程序可以与云和配置引擎无关,因此可以使用多个配置引擎将它们部署到多个云提供商。

目前已经支持 Terraform/OpenTofu、CloudFormation、AWS、GCP 和 Azure,并且正在讨论

查看兼容性矩阵,在相关问题上添加您的👍,并分享您的用例以帮助我们确定优先顺序!

查看兼容性
矩阵
,在相关问题上添加您的👍
,并分享您的用例以帮助我们确定优先顺序!

平台团队还可以使用 CDK 构建自己的定制平台。这可以集中
控制最佳实践、合规性策略、安全性、部署策略以及
Wing 应用程序在组织云环境中实施的任何其他方面。

Wing 仍处于积极开发阶段,但我们已开始看到一些非常酷炫的东西正在
使用它。如果您渴望体验一次真正有趣(但可能有些坎坷)的旅程,我们鼓励您 在本地机器Wing Playground上试用
Wing ,并告诉我们您的 想法。

我们正在设计 Wing,以便让具有现代 面向对象背景(如 TypeScript、Swift、C# 和 Java)的开发人员熟悉和友好,因此您只需5 分钟即可学会。

在今天的期刊中

使用断点进行调试

现在可以设置断点并完全调试您的 Wing 应用程序!

Wing VS Code 扩展程序.w在预检和运行中代码文件中添加断点
,只需按 F5 即可进行调试。现在可以使用内置调试器检查和单步执行
代码。

调试

查看 Mark 的 PR

无服务器函数并发的本地模拟

我们改进了cloud.FunctionWing Simulator 中的执行方式,使其
功能上的行为更接近 FaaS 提供商。现在,我们将每个函数运行在一个独立的子
进程中,并管理其并发限制。

局部模拟

concurrency可以使用可传递给的选项cloud.Function任何采用
飞行中闭包的资源来控制这些限制。

例如:

bring util;
bring cloud;

let queue = new cloud.Queue();

let handler = inflight (x) => {
  log("only one at a time: {x}");
};

queue.setConsumer(handler, concurrency: 1);
//                         ^^^^^^^^^^^^^^

test "push 10" {
  for i in 0..10 { queue.push("{i}"); }
  util.waitUntil(() => { return queue.approxSize() == 0; });
}
Enter fullscreen mode Exit fullscreen mode
  • 使用 运行此程序时concurrency: 1,代码在约 1.5 秒后完成
  • 使用 运行时concurrency: 10,代码在 0.5 秒后完成

查看 Chris 的 PR

适用于 React 和 Vite 的新项目模板

我们正在继续为各种类型的项目添加新的项目模板,并且我们最近为臭名昭著的ReactVite
工具 组合创建了一个模板

查看本指南
以获取详细教程或直接开始:

mkdir my-project && cd my-project
wing new react-vite
Enter fullscreen mode Exit fullscreen mode

通过以下方式向 Wing 类添加 UIbring ui

现在可以通过
ui模块将简单的用户界面元素与 Wing 预检类关联起来。这些元素可以通过简单的
预检闭包实现与您的系统动态交互:

bring ui;

class MyResource {
  counter: cloud.Counter;

  new() {
    this.counter = new cloud.Counter();

    new ui.Button("Cool Button", inflight () => {
      this.counter.inc();
    });

    new ui.Field("Counter", inflight () => {
      return "{this.counter.peek()}";
    });
  }
}
Enter fullscreen mode Exit fullscreen mode

现在,当MyResource在 Wing Console 中选择一个节点时,您将在检查器
窗格中看到以下内容:

带来 UI

我们正在添加更多 UI 元素,迫不及待地想看看人们会用它们构建什么!

查看 Cristian 的 PR

公开云端点以进行 webhook 开发

在开发通过 webhook(例如机器人
和扩展)对来自其他服务的请求做出响应的应用程序时,能够
在开发过程中接受来自这些外部系统的请求通常非常有价值。

所以现在,cloud.Endpoint应用程序中的每个(通过
cloud.Apicloud.Website等显式或隐式定义)都可以公开,并且请求将被传送到本地
模拟器:

端点

这是一个实验性的功能,仍然需要一些完善,我们很乐意听到
您的想法。

查看 Elad 的 PR

明确提升预检对象

当飞行中代码引用预检对象时,该对象将被提升
,并且 对该对象执行的操作将被限定,以便能够确定诸如 IAM 权限之类的内容。

很多情况下,Wing 编译器可以自动限定提升。例如,在下面的代码中,
很明显 inflight 闭包push对被提升的队列对象执行了操作:

bring cloud;

let myQueue = new cloud.Queue();

inflight () => {
  myQueue.push("hello");
};
Enter fullscreen mode Exit fullscreen mode

但由于 Wing 编译器目前不支持符号执行,因此在某些情况下,
编译器无法限定提升。例如,如果我将myQueue
一个新变量赋值给它(yourQueue),就会出现以下错误:

bring cloud;

let myQueue = new cloud.Queue();

inflight () => {
  let yourQueue = myQueue;
  yourQueue.push("hello");
//^^^^^^^^^ Expression of type "Queue" references an unknown preflight object, can't qualify its capabilities.
};
Enter fullscreen mode Exit fullscreen mode

为了克服这个限制,lift()可以使用新的内置函数来明确限定升力:

bring cloud;

let myQueue = new cloud.Queue();

inflight () => {
  lift(myQueue, ["push"]);

  let yourQueue = myQueue;
  yourQueue.push("hello");
};
Enter fullscreen mode Exit fullscreen mode

新的内置lift功能允许您为当前飞行中闭合提升飞行前物体。

此语法仍在讨论中,但我们希望确保它不会阻碍用户。
请查看RFC并参与讨论。

查看 Yoav 的 PR

默认对象标识符的更改

在 Wing 中创建预检
对象
时,每个对象都会获得一个在其定义范围内唯一的标识符。这些标识符 对于在云资源配置时生成确定性的唯一地址
至关重要。

Wing 中对象的默认标识符是类名。以下示例中,
存储桶的标识符很简单"Bucket"

new cloud.Bucket();
Enter fullscreen mode Exit fullscreen mode

以前,默认标识符包括类的命名空间,因此在上面的示例中,
标识符是"cloud.Bucket",但由于命名空间现在可以使用别名(),这导致了不稳定的默认值,这可能会对基础设施产生可怕的影响。bring cloud as
my_cloud

顺便说一句,Wing 还有专用语法 ( as ID) 来确定对象的身份,以防
有多个相同类型的实例,或者您想要更明确:

new cloud.Bucket() as "my_bucket";
Enter fullscreen mode Exit fullscreen mode

我们正在讨论可能改变这种
语法
,所以请让我们知道您的想法。

查看 Elad 的 PR

隐式加载的平台扩展

平台扩展是 Wing 最强大的功能之一
。它们可以确定云资源在云
环境中的实现方式,验证应用程序是否遵循组织策略,或
“在后台”注入最佳实践和常见模式。

到目前为止,可以通过--platform
传递给 Wing CLI 的显式开关将 Wing 配置为使用平台提供程序,但我们已经看到需要模块或库能够提供
平台扩展,而不必要求显式配置。

为此,当 Wing 编译您的代码时,任何wplatform.js找到的文件都将自动
作为平台加载。这种情况在显式加载(例如 )之后发生-t tf-aws,并且也适用于
您的应用程序使用的任何 winglib。

当前探索的用例之一是库能够公开自己的平台
参数。

例如,eventbridgewinglib
公开了一个名为的平台参数,eventBridgeName允许开发人员连接到现有的
EventBridge 总线:

wing compile -t @winglang/platform-awscdk -v eventBridgeName="my-bus" main.w
Enter fullscreen mode Exit fullscreen mode

下面让我们来看一下这个平台扩展是如何实现的:

module.exports.Platform = class {
  parameters = {
    type: "object",
      properties: {
        eventBridgeName: {
        type: "string",
      },
    },
  };
};
Enter fullscreen mode Exit fullscreen mode

查看 Hasan 的 PR

标准化 cron 表达式

类似这样的 cron 表达式* * * * *在基于 Unix 的 crontab 中有效,但在 AWS 中无效。另一方面
* * * * ?在 AWS 中有效,但在其他地方无效。

现在,Wing 将期望 cron 表达式与标准语法匹配,并
在部署到 AWS 时自动将其转换为 AWS 语法:

bring cloud;

new cloud.Schedule(cron: "* * * * *");
Enter fullscreen mode Exit fullscreen mode

查看 Marcio 的 PR

Wingly 更新中的好东西

Wingly Update是我们每两周一次的更新流,我们在其中分享
项目的最新进展,与云行业的人士聊天,讨论并
庆祝云的美丽。

如果您还没有看过我们的节目,您可以 在这里找到我们所有剧集
的完整内容。

以下是我们从最近的展览中精选的一些好东西:

野外之翼

这是我们杂志的一个新栏目,我们从世界各地
精彩的网络上精选了有关 Wing 的内容:

社区活动

您可以在Wingnuts
日历
中找到我们所有活动的详细信息
其中包括:

  • Winlang 社区会议是我们每两周一次的聚会,社区成员在会上展示很酷的应用程序、演示和其他项目。
  • 周一办公时间是我们每两周一次的机会,您可以在这里分享您的反馈、想法和顾虑,或者只是顺便过来打个招呼。

概括

这就是本期的内容!

诚邀您加入Wing Slack!快来和 Wing 的朋友们打个招呼,一起交流吧
!快来访问winglang.io,体验一下 Wing 吧!
如果您还没加入,请关注我们
代码库的最新更新。

期待您下次飞行时能得到热情招待!

- 翼队

鏂囩珷鏉ユ簮锛�https://dev.to/winglang/inflight-magazine-no-9-4fdh
PREV
Working with Git Forking the project Cloning the repository Starting your work Adding a remote repository Saving changes Merging or rebasing changes Merging Rebasing Pushing changes Summary
NEXT
Wing 定制平台:将基础设施策略转化为代码