使用第一个无服务器数据库构建无服务器应用程序

FaunaDB是第一个真正的无服务器数据库。 在本文中,我将使用无服务器框架连接到带有FaunaDB无服务器云连接的AWS Lambda应用程序。

当我说无服务器 ,我指的是函数即服务模式。无服务器系统必须根据请求动态扩展,并且不需要任何容量规划或设置。 例如,您可以偶尔连接到FaunaDB ,并从起初无缝扩展到狂奔访问。

无服务器系统必须根据请求动态扩展。

当前流行的云数据库都不支持这种弹性水平 - 您必须为不使用的容量支付钞票。 此外,他们通常缺乏对构建丰富应用程序所需的联接,索引,身份验证和其他功能的支持。

什么是FaunaDB?

FaunaDB Serverless Cloud是一个全球分布式数据库,不需要配置。 容量是按需计量与提供的 - 您只需支付您使用的费用。 此外,您可以随时将应用程序移植到您自己的数据中心或私有云中的FaunaDB内部部署,从而消除对云基础架构的依赖锁定。

FaunaDB是一个全球分布式数据库,不需要配置 - 您只需要为您使用的内容付费。

FaunaDB非常适合无服务器开发。 让我们编写代码看看如何使用?

开始使用Serverless Framework

Serverless正在领导无服务器框架市场,它有一个干净的系统,用于配置,编写和部署无服务器应用程序代码到不同的云基础架构提供商。 我花了一个下午把他们的存储示例从DynamoDB移植到FaunaDB。 这是令人难以置信的容易完成。 看看代码就会告诉我们设置无服务器环境有多么简单。

我移植的CRUD服务是一个简单的REST API,允许创建,更新和删除todo项目,以及列出所有待办todo事项。 这是一个类似玩具的演示例子,让我们来看看通过展示这些代码以后,我将描述如何增加一个多表多用户的数据模型,用户可以邀请其他成员阅读和更新待办事项列表。将该逻辑推送到FaunaDB会更有效率,但在本示例中,我也受到DynamoDB提供的功能限制。

README包含安装和使用说明 ,您可以在这里访问FaunaDB。

一旦你设置运行,你可以玩玩FaunaDB的更有趣功能,如实现社交图。

定义函数

使用Serverless Framework开始读取任何应用程序的第一个文件是serverless.yml ,它定义了服务并将函数链接到事件处理程序。

readAll示例

在我们我们可以看到函数定义; 这里是其中之一:


functions:
readAll:
handler: handler.readAll
events:
- http:
path: todos
method: get
cors: true


这个配置意味着当在todos路径接收到HTTP GET时, handler.js的readAll函数将被调用。 如果你看看配置,你会看到所有的功能都链接到handler.js ,这就是我们接下来要看的地方。


module.exports.readAll = (event, context, callback) => {
todosReadAll(event, (error, result) => {
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin" : "*"
},
body: JSON.stringify(result),
};

context.succeed(response);
});
};


handler.js中每件事都与管理HTTP有关,因此实际逻辑是从每个函数的模块导入的。 在当前案例情况下, 它是todos-read-all.js 。 我们将整个文件放在这里,因为这是FaunaDB发挥作用的地方。


'use strict';

const faunadb = require('faunadb');
const q = faunadb.query;
const client = new faunadb.Client({
secret: process.env.FAUNADB_SECRET
});

module.exports = (event, callback) => {
return client.query(q.Paginate(q.Match(q.Ref("indexes/all_todos"))))
.then((response) => {
callback(false, response);
}).catch((error) => {
callback(error)
})
};

这种情况下,我将运行一个查询所有todos,使用通过serverless.yml配置使用FaunaDB密码。 FaunaDB使用HTTP进行查询,因此您不必担心在模块或调用之间共享连接。

FaunaDB和DynamoDB接口之间的区别

DynamoDB和FaunaDB版本的主要区别是:

return dynamoDb.scan({TableName: 'todos'}, (error, data) => { … })

变为:

return client.query(q.Paginate(q.Match(q.Ref("indexes/all_todos"))))

运行

按照README说明启动和运行服务,然后创建几个待办事项。

现在,您可以在FaunaDB仪表板中探索您的数据和实验查询。 在dashboard.fauna.com上打开仪表板 。


超越演示

在此应用程序非演示版本的产品版本中,请求将包含一个列表ID,并且我们的查询将验证该列表是否对用户可见,然后才会返回匹配的项目。此安全模型类似于您可能熟悉的协作应用程序,它由FaunaDB本地支持。

原来DynamoDB示例使用scan操作列出所有待办事项。 要移动到DynamoDB中的安全列表共享模型,您必须添加一个索引,然后从无服务器处理程序运行多个查询,以验证该列表对请求用户可见。

如果要使用FaunaDB构建真正的应用程序,您还需要在列表ID上创建一个索引,但是您可以使用查询将身份验证凭据传递到数据库中。不再需要多次调用,FaunaDB将在单个查询中返回所需的数据,包括列表项和元数据。

结论

当我使用无服务器架构构建更多示例时,我将再次选择Serverless.com框架。 您可以期待使用FauanDB的多租户QoS功能动态配置资源的无服务器代码示例,以及如何将FaunaDB与其他无服务器组件集成。

随着时间的推移,您认为哪个提供了更好的敏捷性?是使用传统数据库,在需求改变时重新思考数据表结构布局,并在应用程序代码中实现大量业务策略? -或者使用一个灵活的查询和安全意识实现的数据库? 我希望你同意答案是FaunaDB。


Fauna Blog | Build a serverless app with the first