重大公告!
我开始了我日常的前端系统设计学习之旅。我将在博客中分享每个模块的见解。所以,这就是开始,还有更多精彩!
在本博客中,我们将探讨前端系统设计所必需的不同数据获取机制,包括短轮询、长轮询、WebSocket、服务器发送事件 (SSE) 和 Webhooks。每种技术都满足向客户端和服务器传输数据以及从客户端和服务器传输数据的特定需求,理解它们对于设计可扩展的实时 Web 应用程序至关重要。
短轮询是客户端定期向服务器重复发送请求以检查更新的方法。
setInterval(async () => { const response = await fetch('/api/get-posts'); const data = await response.json(); // Update UI with new data }, 5000); // Poll every 5 seconds
例如 - 股票市场行情、社交媒体提要
长轮询是对短轮询的增强,在短轮询中,客户端发送请求,服务器保持连接打开,直到有新数据要返回。
从后端来看,只有数据更新时才会发送响应,在此之前它将保留请求。如果长时间没有更新则超时处理。
客户端
async function subscribe() { let response = await fetch("/subscribe"); if (response.status == 502) { // Status 502 is a connection timeout error, let's reconnect await subscribe(); } else if (response.status != 200) { // An error - let's show it showMessage(response.statusText); // Reconnect in one second await new Promise(resolve => setTimeout(resolve, 1000)); await subscribe(); } else { // Get and show the message let message = await response.text(); showMessage(message); // Call subscribe() again to get the next message await subscribe(); } } subscribe();
例如-实时客户支持聊天
WebSockets 允许客户端和服务器之间进行全双工通信,使其成为实时数据传输最有效的方法。
客户端打开与服务器的 WebSocket 连接,客户端和服务器都可以通过此单个连接相互发送消息。
webSocket = new WebSocket(url, protocols); // Send message webSocket.send("Here's some text that the server is urgently awaiting!"); // Receive message webSocket.onmessage = (event) => { console.log(event.data); };
例如-实时聊天应用程序、在线多人游戏
SSE 通过 HTTP 连接提供从服务器到客户端的单向更新流。
const evtSource = new EventSource("ssedemo.php"); evtSource.onmessage = (event) => { const newElement = document.createElement("li"); const eventList = document.getElementById("list"); newElement.textContent = `message: ${event.data}`; eventList.appendChild(newElement); };
例如 - 源、通知
Webhooks 是一种服务器到服务器的通信机制,当事件发生时,服务器将数据发送到预定义的 URL。客户端不需要不断检查服务器是否有更新。
通常用于触发系统之间的操作,例如付款通知、GitHub 事件或第三方服务集成。
选择正确的通信方法取决于您的应用程序的要求。 WebSocket 和 SSE 非常适合实时和流数据,而长轮询则在性能和易用性之间提供了平衡。短轮询是针对不频繁更新的简单解决方案,但可能会占用大量资源,而 Webhooks 是服务器到服务器通知的理想选择。
每种技术都有其自身的优点和局限性。了解这些可以帮助您做出明智的决策,以构建高效、响应迅速的 Web 应用程序。
此博客开放供建议和讨论!
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3