实时 + Postgres =?
实时更新几乎是所有现代网络和移动应用的一部分,从银行应用到新闻推送,无所不包。处理实时更新的方式多种多样,因此总会有关于哪种方式更好的讨论。
一点历史
在过去的 10 年里,最常见的方法是使用 websocket 客户端(例如 socket.io)和服务器,并通过在后端触发事件将事件推送给客户。
最近也有一些数据驱动的解决方案,例如 RethinkDB。我很喜欢这个解决方案,因为在我看来,数据的变化应该触发事件,客户端应该订阅特定的查询,客户端的数据也应该相应地进行更改。这就是 RethinkDB 的优势:优秀的客户端库、自带的查询语法以及可扩展性。可惜的是,RethinkDB 项目已经关闭,现在仅由社区维护。
GraphQL是另一个颇有前景的较新开发项目,但早期版本完全没有订阅功能,因此其未来发展前景尚待观察。GraphQL 遵循与 RethinkDB 类似的方法;它使用高效、独立且可扩展的解决方案,可以直接从客户端请求数据,这有助于替代对后端的 API 调用。
目前,GraphQL 可以提供实时订阅功能,但问题在于 GraphQL 是一个独立的数据库。在很多情况下,GraphQL 可以实现实时订阅,但如果使用 PostgreSQL,则尚不清楚能否实现。并非每家公司都有资源迁移到 GraphQL,尤其是在产品规模庞大的情况下,数据库层面的逻辑量也非常大。
我们在自己的一个项目中遇到了这个问题,当时我们意识到需要一种简单的方法来实现实时更新,而又不必放弃 PostgreSQL。Hasura 正是为此应运而生的!我很高兴在 Product Hunt 上找到了他们,因为大约三年来我一直想找到这个问题的解决方案。
Hasura 是什么?
Hasura 是 PostgreSQL 数据库和 GraphQL 服务器之间的代理层,允许您从 PostgreSQL 快速设置实时更新,并且它是开源的。您可以获得 GraphQL 的所有优势,而不会影响对原始数据库的访问,包括 Web 和移动客户端库、查询语法和订阅。
Hasura 的主要功能
是从您的 PostgreSQL 数据库进行实时更新
当我意识到这可以如此轻松地进行设置时,我大吃一惊。
动态访问控制和授权
我们在项目中使用 Auth0;使用 Hasura,我们能够在使用 JWT 的同时限制对数据的访问。Hasura 还拥有出色且易于使用的用户体验,可通过 UI 配置访问规则。观看此视频,了解其实际操作。
例如,您可以在客户端使用多个表。您可以配置用户只有拥有该数据所有者权限才能访问数据,并定义该用户是否拥有读、写或删除权限。
数据库事件触发事件。
您可以订阅数据库中的每个创建、更新和删除操作,并通过传递该数据来调用其他服务。一个可能的用例是作为微服务之间的通信通道,或调用无服务器函数。
这个功能的发布非常棒;以前,我们使用原生 PostgreSQL 订阅来实现这一点,但实际维护它需要大量代码,而且没有一个具有万无一失的解决方案的中心点。
真正令人兴奋的是,这是一个高度可靠的解决方案。无论您的 Hasura 或网络连接发生什么情况,事件都会在您恢复后立即传递。如果由于某些不可预见的问题,事件更改通过对后端的 API 调用传递到 PostgreSQL,而应用程序的其他部分发生故障,情况也是如此。
WS 到 HTTP 回退
它与 Hasura 没有完全关系,但是当您的客户端不支持 WebSockets 时使用 Graphql 订阅,它会自动使用 HTTP 作为替代,而无需您采取任何进一步的操作。
当然,您可能会发现其他有用的功能,例如数据变异和客户解析器。
个人经历
Hasura 是一款非常棒的产品。它为我们节省了大量时间。它目前还没有稳定版本,还在开发中,但我们已经将它投入生产,因为我们工作中使用的所有功能都运行良好。几乎每周都会有新的更新,开发人员会更接近 v1.0.0 的版本。
迁移到 Hasura 解决方案仅用了两周时间;其中一周由一位开发人员开发,另一周用于错误修复和质量保证。最终,我们获得了一个良好且可持续的解决方案,可用于 Web 和移动应用。我们未来计划使用 Hasura 解决方案,包括使用更多事件触发器并迁移到无服务器架构。
您可以通过点击其网站上的链接,一键部署到 Heroku,立即免费试用 Hasura。如果您想了解有关该解决方案的更多信息,我很乐意撰写另一篇文章,解释如何在现有的 PostgreSQL 上进行设置并将其与您的 React/Redux 应用程序一起使用。
文章来源:https://dev.to/alex_barashkov/real-time--postgres---2j6d