无服务器架构是近年来越来越受到关注的一种新型架构,它的最大特点是无需关注基础设施细节,只需关注业务逻辑即可,具有更高的可扩展性和灵活性。而 Pub/Sub,即发布订阅模式,是一种常用的消息机制,它能够在分布式系统中实现解耦,提高系统灵活性和可伸缩性。
本文将介绍如何将 Pub/Sub 应用于无服务器架构,以实现更高效的业务逻辑和更灵活的应用架构。
无服务器架构下的 Pub/Sub
在无服务器架构下, Pub/Sub 可以分为两种模式:同步模式和异步模式。
同步模式
在同步模式下, Pub/Sub 服务可直接与业务逻辑代码集成,如下图所示:
上图中, Pub/Sub 服务通过直接调用业务逻辑代码实现。当有新的消息发布时, Pub/Sub 服务会调用订阅者的业务逻辑代码,从而实现消息传递。
实现方式如下所示:
// javascriptcn.com 代码示例 const pubSubClient = new PubSub(); const topicName = 'my-topic'; const subscriptionName = 'my-subscription'; const subscription = pubSubClient.subscription(subscriptionName); subscription.on('message', (message) => { console.log(`Received message: ${message.id}`); console.log(`Data: ${message.data}`); console.log(`Attributes: ${message.attributes}`); message.ack(); }); const data = JSON.stringify({ foo: 'bar' }); const attributes = { attr1: 'value1', attr2: 'value2' }; const topic = pubSubClient.topic(topicName); await topic.publish(data, attributes);
上面的代码演示了如何使用 Google Cloud Pub/Sub 的同步模式。其中,调用 subscription.on()
方法监听消息,接收到消息后打印消息内容,并通过 message.ack()
方法确认消息。调用 topic.publish()
方法发布消息,其中 data
表示消息内容,attributes
表示附加属性。
异步模式
在异步模式下, Pub/Sub 服务可以通过消息队列连接异步处理的服务,如下图所示:
上图中, Pub/Sub 服务通过将消息发布到消息队列中,然后异步调用订阅者的后端服务进行处理。通过这种方式, Pub/Sub 服务能够很好地解耦消息来源和处理逻辑,提高整个系统的灵活性和可伸缩性。
实现方式如下所示:
// javascriptcn.com 代码示例 const pubSubClient = new PubSub(); const topicName = 'my-topic'; const subscriptionName = 'my-subscription'; const subscription = pubSubClient.subscription(subscriptionName); const handler = async (message) => { console.log(`Received message: ${message.id}`); console.log(`Data: ${message.data}`); console.log(`Attributes: ${message.attributes}`); message.ack(); }; subscription.on('message', (message) => handler(message)); const data = JSON.stringify({ foo: 'bar' }); const attributes = { attr1: 'value1', attr2: 'value2' }; const topic = pubSubClient.topic(topicName); await topic.publish(data, attributes);
上面的代码演示了如何使用 Google Cloud Pub/Sub 的异步模式。其中,调用 subscription.on()
方法监听消息,接收到消息后调用 handler()
函数进行处理,其中实现业务逻辑。调用 topic.publish()
方法发布消息,其中 data
表示消息内容,attributes
表示附加属性。
示例代码
下面是一个使用 AWS Lambda 和 SNS 的示例代码,展示如何在无服务器架构下实现 Pub/Sub 服务。
在 AWS Lambda 中创建两个函数,一个函数负责发布消息,一个函数负责处理消息,代码如下所示:
发布消息:
// javascriptcn.com 代码示例 const AWS = require('aws-sdk'); const sns = new AWS.SNS({ region: 'ap-southeast-1' }); exports.handler = async (event) => { const params = { Message: event.message, TopicArn: event.topicarn }; await sns.publish(params).promise(); };
处理消息:
// javascriptcn.com 代码示例 const AWS = require('aws-sdk'); const sns = new AWS.SNS({ region: 'ap-southeast-1' }); const lambda = new AWS.Lambda({ region: 'ap-southeast-1' }); exports.handler = async (event) => { const message = JSON.parse(event.Records[0].Sns.Message); const functionParams = { FunctionName: "my-function-name", InvocationType: "RequestRresponse", Payload: JSON.stringify(message) }; await lambda.invoke(functionParams).promise(); };
如上代码所示,通过 AWS SNS 发布消息,然后通过 AWS Lambda 处理消息。其中,发布消息的 Lambda 函数 exports.handler
接收 event.topicarn
和 event.message
作为输入,然后调用 AWS SDK 进行消息发布。处理消息的 Lambda 函数 exports.handler
接收 event
作为输入,从中获取消息内容,然后使用 Lambda 的 invoke
方法调用预先定义的函数进行处理。其中 InvocationType
参数为 RequestRresponse
,表示需要等待函数返回结果。
总结
无服务器架构与 Pub/Sub 技术的结合,能够实现高效的业务逻辑和灵活的应用架构,提高系统灵活性和可伸缩性。本文介绍了在无服务器架构下使用 Pub/Sub 的两种模式:同步模式和异步模式,并提供了一个使用 AWS Lambda 和 SNS 的示例代码。希望本文对您有所启发和帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654b08077d4982a6eb4f89a5