现在很多应用都需要实时功能。用户希望看到即时更新的内容,享受交互式体验。无论是聊天软件、实时数据看板、游戏排行榜还是物联网系统,Amazon AppSync Events通过WebSocket api让这些实时功能成为可能。它帮你构建可扩展的高性能实时应用,你不需要担心规模问题或连接管理。
Powertools for Amazon Lambda是一个开发工具包,它提供了很多实用功能:可观测性、批处理、参数存储集成、幂等性、功能开关、云监控指标、结构化日志记录等。现在Powertools通过新的AppSyncEventsResolver支持AppSync Events,可以在Python、TypeScript和.NET中使用。这个新功能让你能更专注于业务逻辑,提升开发体验。AppSyncEventsResolver为处理事件提供了简单统一的接口,内置支持过滤、转换和路由事件等常见模式。
下面我会用TypeScript示例来说明,但你也可以在Python和.NET函数中使用相同的功能。
如何使用AppSyncEventsResolver设置事件处理器
如何实现不同的事件处理模式来获得更好性能
如何使用基于模式的路由来组织事件处理器
如何利用内置功能处理常见需求
AppSyncEventsResolver为Lambda函数处理AppSync Events提供了简单的声明方法。事件解析器可以监听PUBLISH和SUBSCRIBE事件。PUBLISH事件在客户端向频道发送消息时发生,SUBSCRIBE事件在客户端尝试订阅频道时发生。你可以为不同的命名空间和频道注册处理器来管理事件驱动的通信。
下面是基本的使用示例:
import {
AppSyncEventsResolver,
UnauthorizedException,
} from '@aws-lambda-powertools/event-handler/appsync-events';
// 定义消息类型
type ChatMessage = {
userId: string;
content: string;
}
// 简单的权限检查
const isAuthorized = (path: string, userId?: string): boolean => {
// 根据你的权限系统进行检查
if (path.startsWith('/chat/private') && !userId) {
return false;
}
return true;
};
// 消息处理逻辑
const processMessage = async (payload: ChatMessage) => {
// 这里可以:
// - 验证消息内容
// - 存储到数据库
// - 丰富数据
return {
...payload,
timestamp: new Date().toISOString()
};
};
const app = new AppSyncEventsResolver();
// 处理特定频道的发布事件
app.onPublish('/chat/general', async (payload: ChatMessage) => {
// 处理并返回消息
return processMessage(payload);
});
// 处理所有频道的订阅事件
app.onSubscribe('/*', async (info) => {
const userId = info.request.headers['user-id'];
// 执行访问控制检查
if (!isAuthorized(info.channel.path, userId)) {
throw new UnauthorizedException(`不允许订阅 ${info.channel.path}`);
}
return true;
});
export const handler = async (event, context) =>
app.resolve(event, context);AppSyncEventsResolver类负责解析传入的事件数据,根据事件类型调用对应的处理器方法。
AppSyncEventsResolver使用直观的基于模式的路由系统,让你可以根据频道路径组织事件处理器。你可以:
处理特定频道 (/chat/general)
为命名空间使用通配符 (/chat/*)
创建全局处理器 (/*)
import { AppSyncEventsResolver } from '@aws-lambda-powertools/event-handler/appsync-events';
const app = new AppSyncEventsResolver();
// 特定频道处理器
app.onPublish('/notifications/alerts', async (payload) => {
// 你的处理逻辑
});
// 处理notifications命名空间中的所有频道
app.onPublish('/notifications/*', async (payload) => {
// 你的处理逻辑
});
// 全局处理器
app.onPublish('/*', async (payload) => {
// 你的处理逻辑
});
export const handler = async (event, context) =>
app.resolve(event, context);最通用的处理器是/*,它会匹配任何命名空间和频道。当多个处理器匹配同一个事件时,库会调用最具体的处理器,忽略不太具体的处理器。例如,如果你为/default/channel1注册了处理器,又为/default/*注册了另一个处理器,Powertools会为匹配/default/channel1的事件调用第一个处理器,忽略第二个。这样你就能控制事件处理方式,避免不必要的处理。
如果事件不匹配任何处理器,Powertools默认会原样返回事件并记录警告。这意味着事件会在不做任何修改的情况下传递。这种方法有助于逐步采用这个库,让你可以用自定义逻辑处理特定事件,其他事件由默认行为处理。
Powertools也提供了处理订阅事件的简单方法。它会自动解析传入事件,根据事件类型调用对应的处理器。默认情况下,AppSync允许订阅,除非你的Lambda处理器抛出错误或明确拒绝请求。当订阅被拒绝时,AppSync会向客户端返回4xx响应,阻止建立订阅。
import { AppSyncEventsResolver } from '@aws-lambda-powertools/event-handler/appsync-events';
import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics';
import type { Context } from 'aws-lambda';
const metrics = new Metrics({
namespace: 'serverlessAirline',
serviceName: 'chat',
});
const app = new AppSyncEventsResolver();
app.onSubscribe('/default/foo', (event) => {
metrics.addDimension('channel', event.info.channel.path);
metrics.addMetric('connections', MetricUnit.Count, 1);
});
export const handler = async (event: unknown, context: Context) =>
app.resolve(event, context);当订阅事件到达时,库会调用对应的处理器,传递事件对象作为第一个参数。你可以根据订阅事件执行任何必要操作,比如运行访问控制检查:
app.onSubscribe('/private/*', async (info) => {
const userGroups = info.identity?.groups || [];
const channelGroup = 'premium-users';
if (!userGroups.includes(channelGroup)) {
throw new UnauthorizedException(
`订阅需要 ${channelGroup} 组成员身份`
);
}
});订阅事件遵循相同的匹配规则,提供对完整事件和上下文的相同访问权限。
虽然解析器简化了事件处理,但在需要时你仍然可以完全访问事件和上下文对象。这在需要额外信息的场景中很有用,比如请求头或Lambda上下文中的剩余执行时间。
解析器将完整的事件和上下文作为第二和第三个参数传递给每个处理器。这样你就能访问所有相关信息,不需要修改现有代码。
import { AppSyncEventsResolver } from '@aws-lambda-powertools/event-handler/appsync-events';
import { Logger } from '@aws-lambda-powertools/logger';
const logger = new Logger({
serviceName: 'serverlessAirline'
});
const app = new AppSyncEventsResolver({ logger });
app.onPublish('/orders/process', async (payload, event, context) => {
// 访问请求头
const { headers } = event.request;
// 访问Lambda上下文
const remainingTime = context.getRemainingTimeInMillis();
logger.info('处理事件详情', {
headers,
remainingTime
});
return payload;
});
export const handler = async (event, context) =>
app.resolve(event, context);AppSyncEventsResolver提供内置错误处理,防止Lambda函数失败,同时确保错误正确传达给AppSync,然后传播给客户端。当处理器中发生错误时,解析器不会让整个Lambda调用失败,而是捕获错误并将其包含在响应中。
这种方法确保Lambda函数继续执行,同时为AppSync提供正确格式的错误消息。在处理多个事件时,如果一个事件失败,其他事件继续正常处理。这在并行处理场景中特别有用,你希望确保一个事件中的错误不会影响其他事件。
import { AppSyncEventsResolver } from '@aws-lambda-powertools/event-handler/appsync-events';
const app = new AppSyncEventsResolver();
app.onPublish('/messages', async (payload) => {
// 如果消息包含"error",抛出异常
if (payload.message === "error") {
throw new Error("无效消息");
}
return payload;
});
export const handler = async (event, context) =>
app.resolve(event, context);AppSyncEventsResolver具有额外的高级功能,帮助你构建健壮且可维护的实时应用程序。
默认情况下,我们为每条消息调用一次你的路由处理器。这让你专注于业务逻辑,避免编写重复代码。Powertools处理消息迭代,转换事件和响应格式。你只需要返回想要用作负载的值,或为该消息抛出错误。然后库将负载与正确的事件ID关联。
import { AppSyncEventsResolver } from '@aws-lambda-powertools/event-handler/appsync-events';
import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics';
type SensorReading = {
deviceId: string;
temperature: number;
humidity: number;
timestamp: string;
}
const app = new AppSyncEventsResolver();
const metrics = new Metrics({ namespace: 'SensorReadings' });
app.onPublish('/sensors/readings', async (payload: SensorReading) => {
// 独立处理每个传感器读数
if (payload.temperature > 100) {
metrics.addDimension('alertType', 'highTemperature');
metrics.addMetric('HighTemperature', MetricUnit.Count, 1);
throw new Error('温度读数过高');
}
// 用处理时间戳丰富负载
return {
...payload,
processed: true,
processedAt: new Date().toISOString()
};
});
export const handler = async (event, context) =>
app.resolve(event, context);这种模式通过让你只编写单个事件的逻辑来简化开发,Powertools自动处理其余部分。
批量处理模式让你将多个事件作为单个批次处理,而不是单独处理它们。这在你想要优化资源使用时特别有用,比如在单个操作中向数据库发送多个查询,或在处理之前一起分析多个事件。
要实现这一点,你可以将aggregate选项设置为true。使用此模式时,解析器在单个调用中将整个事件列表发送给你的处理器,让你将它们作为批次处理。
import { AppSyncEventsResolver } from '@aws-lambda-powertools/event-handler/appsync-events';
const app = new AppSyncEventsResolver();
app.onPublish('/default/*', async (events) => {
const results = [];
for (const event of events) {
try {
// 处理每个事件
const result = await processEvent(event);
results.push(result);
} catch (error) {
results.push({
error: {
errorType: 'Error',
message: error.message,
},
id: event.id,
});
}
}
return results;
}, {
aggregate: true,
});
export const handler = async (event, context) =>
app.resolve(event, context);注意aggregate选项仅适用于发布事件。使用此选项时,你负责处理事件并返回适当的响应。
要过滤掉事件,在频道处理器中抛出错误。如果处理器为特定事件抛出错误,库会捕获它并在响应列表中添加错误对象。这表明相应的消息应该被丢弃。这允许你静默过滤事件或向订阅者提供有意义的错误反馈。
import { AppSyncEventsResolver } from '@aws-lambda-powertools/event-handler/appsync-events';
app.onPublish('/moderation/*', async (payload) => {
// 过滤掉不当内容
if (await containsInappropriateContent(payload)) {
throw new Error('内容违反指导原则');
}
// 处理有效内容
return await processContent(payload);
});
export const handler = async (event, context) =>
app.resolve(event, context);Powertools for Amazon中的AppSyncEventsResolver通过为处理实时事件提供简单统一的接口,提升了使用AppSync Events的开发体验。通过减少重复代码并为常见模式提供内置支持,你可以更专注于业务逻辑而不是基础设施代码。
这个工具让实时应用开发变得更简单、更高效。无论你是构建聊天应用、实时数据看板还是物联网系统,AppSyncEventsResolver都能帮你快速实现可靠的实时功能。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
这篇文章简单的分享一套我认为有助于提升开发者工作流的工具集。这套工具集中的大部分你可能见过,也可能没见过,如果有哪个/些让你眼前一亮,那么我的分享就很值了。这个列表包含许多种类的资源,所以这里我将它们分组整理。
今天给大家分享前端程序员最爱用的代码编辑器,来看看你用哪款?包括:Visual Studio Code、Atom、HBuilder、Sublime Text、Dreamweaver、Brackets、Notepad++
Js常用工具方法封装:type 类型判断、Date、Array、String 字符串操作、Number、Http、DOM、Other 其它操作
日常开发中,编写 Node.js 命令行工具来完成一些小任务是很常见的操作。其编写也不难,和日常编写 Node.js 代码并无二致。package.json 中的 bin 字段
做过校验需求的小伙伴们都知道,校验其实是个麻烦事。规则多,需要校验的字段多,都给我们前端带来巨大的工作量。一个不小心,代码里就出现了不少if else等不可维护的代码。因此,我觉得一个团队或者是一个项目
Licia 是一套在开发中实践积累起来的实用 JavaScript 工具库。该库目前拥有超过 300 个模块,同时支持浏览器、node 及小程序运行环境,提供了包括日期格式化、md5、颜色转换等实用模块,可以极大地提高开发效率。
WordGrinder它是一款使用起来很简单,但拥有足够的编写和发布功能的文字编辑器。Proselint:它是一款全能的实时检查工具。GNU Aspell:
工欲善其身必先利器,作为前端行业的你,如果知道一些好用的软件工具可以帮助他们更好的工作。下面,就给大家分享Web前端开发工程师常用的工具。
ES2017+,你不再需要纠结于复杂的构建工具技术选型。也不再需要gulp,grunt,yeoman,metalsmith,fis3。以上的这些构建工具,可以脑海中永远划掉。100行代码,你将透视构建工具的本质。
一旦被那些受利益驱使或有政府背景的黑客团伙盯上,在这场不太公平的攻防博弈中,你会明显感到力不从心。他们有充足的时间,有娴熟的技术和丰富的资源,而且只要在无数次的尝试中成功一次就可以大获全胜
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!