Webhook 与轮询
什么是投票?
什么是 webhook?
重要区别
我该选哪一个?
本文将比较 webhook 与轮询,分析每种方法的优缺点,并讨论何时使用哪种方法。
在构建 Web 应用时,我们通常会使用多个服务。绝大多数情况下,它们由多个不同的 Web 服务协同工作组成。在这种由多个服务组成的 Web 应用中,如何传输数据是每个开发者都需要考虑的问题。
为了解决这个问题,两种主流方法:Webhook 和轮询。每种方法都提供了一种独特的方式从一个服务获取数据并将其传递到另一个服务。选择哪种方法会对应用程序的效率、实时性和整体用户体验产生重大影响。本文将比较 Webhook 和轮询,分析每种方法的优缺点,并讨论何时使用哪种方法。
什么是投票?
轮询(通常称为 API 轮询)是客户端以固定的间隔(比如每 x 秒)请求特定数据,服务器以请求的数据进行响应的过程。
可以把它想象成定期询问“有新数据吗?”。轮询可以通过 HTTP 请求实现,客户端向服务器发送 GET 请求,服务器返回请求的数据。
想象一下,John 构建了一个名为 Doc.AI 的 AI 文档产品,并使用 Logto 进行用户身份管理。
Frank 是一位注册了 John 产品并创建了个人账户的用户。有一天,Frank 加入了他的朋友 David 创建的工作区。当时,John 想给 Frank 发一封邮件,要求他启用多重身份验证 (MFA) 来增强账户安全性,否则 John 会授予他访问其他敏感资源的权限。
John 的产品后端需要不断轮询相关 API,以了解 Frank 何时加入 David 的工作区。
什么是 webhook?
Webhook(即“HTTP 回调”)是一种实时数据通信机制,当事件发生时,服务器会将数据发送到客户端。与客户端请求数据不同,Webhook 会在每次有更新时将数据推送到客户端。
可以把它想象成你应用程序的收件箱。当某些事件发生时(例如,新用户注册或付款),Webhook 会向收件箱发送一条消息,让你的应用程序知道发生了什么。
让我们继续之前用来解释轮询的 Doc.AI 示例。如果我们使用 webhook 来查询 Frank 是否加入了 David 的工作区,序列图将如下所示:
重要区别
- 请求来源轮询由客户端初始化(在我们的例子中,Doc.AI 是客户端,Logto 是服务器),并且 webhook 由事件触发并由服务器启动。
- 资源消耗:轮询会浪费计算资源,因为它会每隔一段时间发送请求,导致计算资源效率低下。而 Webhook 是由服务器“按需”发起的,相比轮询,客户端和服务器端的资源消耗都小得多。
- 定时轮询是客户端发起的,因此客户端可以控制数据获取的时机;而webhook是服务端发起的,客户端只能接收并处理数据。但由于两者机制不同,webhook可以做到数据的实时同步,而轮询则无法做到。
我该选哪一个?
基于轮询和 webhook 的机制,通常的做法是,只有当数据更新频繁,且对数据实时性要求不高的时候,才选择轮询,其他情况下 webhook 会是更好的选择。
然而,在选择使用 webhook 时,开发者需要注意以下几个问题:
- 如果系统高度依赖获取的数据,则需要考虑有一个备用方案,以便在 webhook 出现故障、数据无法同步时获取数据,包括但不限于轮询或者要求 webhook 有重发机制等。
- 在接收 webhook 的客户端端点,应应用 API secret 和内容签名验证等,以防止黑客通过伪造 webhook 来攻击客户端。
- 由于webhook可能会发送重复的请求,此时需要进行相应的处理,防止数据重复和不一致。
Logto 作为一款广受欢迎的用户身份识别解决方案,提供丰富的 webhook 场景和卓越的安全性。使用 Logto 作为您的产品身份识别系统,可以轻松集成并适配各种应用场景。
文章来源:https://dev.to/logto/webhooks-vs-polling-37d1