我一直想进行实时聊天。
几年前,我在PHP+Ajax+Mysql中就这样做了,并破坏了我的服务器。
然后我尝试使用Flash+一个文本文件。我放弃了,已经10年没有尝试过了。但最近我听说了webhook和websocket。
它们似乎都是一种实现这一点的方法,但我并没有真正理解其中的区别。
有人能解释吗?
谢谢!
Webhook
Webhook用于服务器到服务器的通信。它们的工作方式是,一台服务器告诉另一台服务器,当发生什么事情时,它希望将数据发送到某个url。
本文讨论了webhook在流行服务中的一些用法。这个组织谈论了很多关于在RESTfulAPI的上下文中使用它们的问题。
Websockets
网络套接字(通常)用于服务器到浏览器的通信。服务器承载一个websocket服务器,客户端可以打开与该服务器的连接。这种方法现在很流行,主要是因为它比解决问题的旧方法(如长轮询/COMT)更快,占用资源更少。
可以使用websocket连接2台服务器,但这通常不是它们的用途。
混乱
尽管其中一个是(专门)服务器服务器,另一个(主要)是浏览器服务器,但这些技术经常在同一个地方讨论,几乎就像它们在解决相同的问题一样。如果你往上看足够高的链,你会发现它们都解决了"实时"通信的问题,但它们以非常不同的方式解决了这个问题的不同方面。
可能存在直接比较的一种情况是,如果您正在构建将由第三方服务器使用的API。在这种情况下,您可以提供webhook API或websocket API。两者都允许第三方快速获得更新:
- 如果你选择了webhook,第三方仍然需要想办法将你告诉他们的更改推送到他们客户的浏览器上
- 如果你提供websocket API,第三方可以直接设置他们的网站,这样他们的每个用户都可以直接连接到你的websocket API,而他们的服务器必须做更少的工作
以下是一些关于在webhook和websocket之间进行选择的附加信息。
通过网络套接字进行服务器到服务器的通信在新一代聊天机器人应用程序中变得很流行。现在,许多聊天机器人运行在websocket上,提供了一个主要优势,即内部私人机器人不需要面向公众的URL。在这种环境中,以下是关于何时考虑使用webhook与websocket的一些指导原则。
Websockets
- 如果你的应用程序是浏览器应用程序,请使用websockets,因为你的应用无法接收webhook
- 如果你的应用程序是一个服务器应用程序,通过互联网接收来自服务的消息,并且你不想打开防火墙,请考虑使用websocket。一些公司要求在开通此类连接之前进行信息安全审查
Webhook
- 如果您的服务器应用程序需要进行多次订阅,请准备好处理与服务器的打开websocket连接量(请参阅本文了解1M websocket的连接),或者切换到webhook。一些流行的聊天机器人已经从websocket转移到webhook,以提高可扩展性
- 如果你的服务器应用程序在(AWS Lambda、谷歌云功能等)上作为云功能运行,请使用webhook,因为你的应用程序不会保持websocket连接打开
- 如果您的服务器应用程序在Heroku免费层上运行,请使用webhook,因为您的Dyno将进入睡眠状态,并且每天必须睡眠6小时,除非您手动指示服务器睡眠
Webhooks
在webhook中,我们有客户端和webhook api提供程序。客户通常会进行一次注册。在这个注册中,客户端定义了客户端感兴趣的事件以及webhook提供程序发送更新的回调url。每当有事件更新时,webhook提供者就会向url发送带有相关信息的post请求。
- Webhook主要用于服务器到服务器的通信。您的客户端通过stripe进行支付,stripe api让您的应用程序服务器成功完成支付
- api提供者必须处理失败时的重试策略
- 如果客户端公开了一个端点,以便向必须公开访问的webhook提供程序注册,那么您就必须保护这个端点
- webhook表示单个事件。事件的激增会产生大量噪音,您的服务器必须能够处理这些噪音。如果你同时有大量来自不同服务的webhook,会发生什么?这可能会导致用户体验下降,甚至全面超时
Websockets
在websocket中,您有客户端和服务器。客户端向服务器发送握手http请求。若服务器同意使用websocket,那个么客户端和服务器会将它们的通信升级为长期的tcp连接。通过建立这种连接,客户端和服务器都可以双向通信。一个常见的用例是聊天应用程序。
- Websocket主要用于服务器到浏览器的通信
- Websocket创建双向低延迟通信。由于客户端和服务器维护单一的tcp连接,因此延迟非常低。除此之外,客户端和服务器可以使用同一通道同时交换消息
- 因为客户端不需要发送多个请求,所以减少了http请求的开销
- 客户端负责连接。如果连接失效,他们必须处理重新连接
- 服务器必须应对可扩展性方面的挑战。由于客户端本质上是在建立单个连接