在我担任云架构师的多个项目工作期间,我注意到一个反复出现的挑战:
整合多种数据源并向多个客户端提供实时更新
无论是监测智能农业中的环境条件、跟踪物流中的资产,还是管理智能城市中的连接设备,即时处理和处理数据的能力都可以产生重大影响。
在这篇文章中,我将分享使用 AWS 无服务器应用程序模型 (SAM) 构建无服务器近实时数据集成平台的经历。
所有基础架构代码均可在 GitHub 存储库中找到:
https://github.com/agriado-dev/sam-real-time-websockets
概述
了解实时与近实时
在深入研究细节和架构组件之前,有必要澄清平台的一个核心概念,这个概念有时会引起混淆。在数据处理的背景下,“实时”和“近实时”之间有什么区别?
-
实时:数据在生成后立即处理并交付,几乎没有延迟。这在需要立即采取行动的情况下至关重要。示例包括工业自动化、联网汽车和医疗保健监控。
-
近实时:这指的是数据处理略有延迟,通常从几毫秒到几秒不等。示例包括数据分析、CDN 和社交媒体监控。
关于此项目
要回答这个问题,
这个平台是实时的还是近实时的?
我们必须考虑到,真正的实时意味着数据在严格的时间限制下以最小的延迟(通常是微秒或毫秒)进行处理和传输。此项目实施所使用的云资源无法实现这种即时性,让我们分析一下最重要的云资源:
-
AWS Lambda:由于冷启动和函数执行时间,引入了一些延迟。虽然这种延迟通常很小(通常在几毫秒到几秒内),但这确实意味着它不能被视为“真正的”实时,而是以近实时的方式运行。
-
WebSocket API:该组件允许低延迟通信,更接近实时,但总体延迟受所连接服务的处理时间的影响。
-
DynamoDB 和 Streams:提供非常快速的数据检索和存储功能,但由流触发的 Lambda 仍然会引入额外的处理时间。
考虑到这些因素,该平台最准确的描述应该是“近实时”。然而,这种方法有一些好处,从成本效益到可扩展性和简单性,但请记住,根据您应用程序所面临的用例,近实时可能是最佳决策。
建筑学 冷库 www.cqzlsb.com
我将探索该项目的架构,详细介绍各种组件,并解释无服务器方法如何提供合适且有效的解决方案。此外,还将描述一个工作流示例,以便更好地理解该项目的工作原理:
成分:
-
客户端集成:能够连接到 WebSocket API 并接收实时数据更新的前端应用程序(移动和 Web 应用程序)。
-
WebSocket API 网关:应用程序的入口点。它负责处理 WebSocket 连接和发送到客户端的消息。
-
OnConnect Lambda 函数:当客户端连接到 WebSocket API 网关时触发。将连接信息存储在 DynamoDB 表中。
-
OnDisconnect Lambda 函数:当客户端与 WebSocket API 网关断开连接时触发。从 DynamoDB 表中删除连接信息。
-
OnReceiveRealTimeItem Lambda 函数:当新项目添加到 DynamoDB 表时触发。将实时数据更新发送给对该项目感兴趣的客户端。
-
RealTimeData DynamoDB 表:用于存储实时数据项。每个项都有一个唯一的键和一个代表发送给客户端的数据的值。
-
WebSocketConnectionManager DynamoDB 表:存储连接到 WebSocket API 网关的客户端的连接信息。每个项目都有一个唯一的 connectionId 和一个 realTimeItemKey,代表客户端感兴趣的项目。
-
集成源:负责向平台发送实时数据更新的数据源。对于此项目,已考虑以下来源:
-
SDK:与任何语言兼容的 AWS SDK 和 CLI。
-
数据传输:任何能够将数据发送到平台的数据传输机制。例如,从其他数据库复制数据。
-
设备位置和传感器:物联网设备主要发送传感器数据和遥测数据。例如,车辆的 GPS 位置。
-
REST API:例如,将天气数据发送到平台的天气 API。
-
异步(SNS、SQS):能够将数据发送到平台的异步机制。例如,将数据发送到平台的 SNS 主题。
-
S3 事件:由 S3 存储桶触发的事件。例如,当新文件上传到存储桶时。
-
工作流程:
接下来,我们将描述图中标记的不同编号的步骤:
-
客户端集成连接到 WebSocket API 网关。
-
WebSocket API 网关触发 OnConnect Lambda 函数。
-
OnConnect 和 OnDisconnect Lambda 函数存储和删除 WebSocketConnectionManager DynamoDB 表中的连接信息。
-
RealTimeData 项目从集成源添加到 RealTimeData DynamoDB 表中。
-
OnReceiveRealTimeItem lambda 函数通过 DynamoDB Streams 触发。
-
OnReceiveRealTimeItem lambda 函数将实时数据更新发送给对该项目感兴趣的客户端。
-
客户端集成从 WebSocket API 网关接收实时数据更新。
设置并测试平台
为了相应地测试平台,我们将使用 wscat 实用程序模拟 API 客户端并监控 websocket API。这样我们就可以让每个 tes 客户端立即接收数据。
npm install wscat
我们可以在 AWS 控制台中检索 WebSocket API 端点,尽管将其作为 SAM 项目的输出很有用:
端点应具有以下组成:
wscat -c wss://[api-id].execute-api.[aws-region-id].amazonaws.com/[environment]?realTimeItemKey=[item-key]
请注意,realTimeItemKey
查询参数是连接到 WebSocket API 所必需的。此参数用于过滤发送到客户端的消息。此参数的值必须与realTimeItemKey
要接收更新的项目的属性相同。
根据项目规范,这realTimeItemKey
是一个动态值,可以根据客户/集成需求进行调整。
在我们的示例中,我们将使用 vehicleId 作为实时项目来接收来自多个客户端的更新,那么,应该realTimeItemKey
是vehicleId
,并且连接的命令应该是:
wscat -c wss://svcz00plil.execute-api.eu-central-1.amazonaws.com/develop?vehicleId=3
让我们看一下该平台三个主要事件的一些示例:
- 连接时:
- 断开连接时
- 接收实时项目时
结论
该项目是无服务器架构中简单的近实时集成的绝佳示例。它可以作为实现更复杂集成的起点,也可以添加到另一个项目中以进行实时处理。
我认为,优化这类数据集成并使其尽可能高效非常重要。许多项目过度使用轮询,这可以被视为正确实时实施的反模式。
此外,请注意,该项目的一个特殊部分专注于 IaC,因为实现可以在任何云环境(在本例中为 AWS)中重复使用和复制的工作负载至关重要