女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

輪詢(xún)、SSE 和WebSocket哪個(gè)更好

jf_78858299 ? 來(lái)源:超級(jí)架構(gòu)師 ? 作者:南極真君 ? 2023-02-22 10:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

構(gòu)建實(shí)時(shí)Web應(yīng)用程序有點(diǎn)挑戰(zhàn),我們需要考慮如何將數(shù)據(jù)從服務(wù)器發(fā)送到客戶(hù)端。能夠“主動(dòng)”實(shí)現(xiàn)這一功能的技術(shù)已經(jīng)存在了很長(zhǎng)時(shí)間,并且僅限于兩種通用方法:客戶(hù)端請(qǐng)求或服務(wù)器請(qǐng)求。

實(shí)現(xiàn)這些的幾種方法:

  1. 長(zhǎng)/短輪詢(xún)(客戶(hù)端拉動(dòng))
  2. WebSockets(服務(wù)器推送)
  3. 服務(wù)器發(fā)送的事件(服務(wù)器推送)
  • 客戶(hù)端拉取-客戶(hù)端以一定的定期間隔向服務(wù)器請(qǐng)求更新
  • 服務(wù)器推送-服務(wù)器正在主動(dòng)將更新推送到客戶(hù)端(客戶(hù)端拉取的反向操作)

圖片

讓我們以一個(gè)簡(jiǎn)單的用例來(lái)比較以上技術(shù),然后選擇合適的技術(shù)。

范例:

我們的示例用例非常簡(jiǎn)單。我們需要開(kāi)發(fā)一個(gè)儀表板Web應(yīng)用程序,該應(yīng)用程序可以流轉(zhuǎn)來(lái)自(GitHub / Twitter / .. etc)等網(wǎng)站的活動(dòng)列表。這個(gè)應(yīng)用程序的目的是從上面列出的各種方法中選擇合適的一種。

1.使用輪詢(xún):

輪詢(xún)是一種技術(shù),客戶(hù)端通過(guò)該技術(shù)定期向服務(wù)器請(qǐng)求新數(shù)據(jù)。我們可以通過(guò)兩種方式進(jìn)行輪詢(xún):短輪詢(xún)和長(zhǎng)輪詢(xún)。簡(jiǎn)單來(lái)說(shuō),短輪詢(xún)是基于AJAX的計(jì)時(shí)器,它以固定的延遲進(jìn)行調(diào)用,而長(zhǎng)輪詢(xún)則基于Comet(即,當(dāng)服務(wù)器事件發(fā)生時(shí),服務(wù)器將無(wú)延遲地將數(shù)據(jù)發(fā)送到客戶(hù)端)。兩者都有優(yōu)點(diǎn)和缺點(diǎn),并根據(jù)用例進(jìn)行調(diào)整。有關(guān)深入的詳細(xì)信息,請(qǐng)閱讀StackOverflow社區(qū)給出的答案。

讓我們看看一個(gè)簡(jiǎn)單的客戶(hù)端長(zhǎng)輪詢(xún)代碼段的外觀:

/* Client - subscribing to the github events */

subscribe: (callback) => {

const pollUserEvents = () => {

$.ajax({

method: 'GET',

url: 'http://localhost:8080/githubEvents',

success: (data) => {

callback(data) // process the data

},

complete: () => {

pollUserEvents();

},

timeout: 30000

})

}

pollUserEvents()

}

這基本上是一個(gè)長(zhǎng)輪詢(xún)功能,它像往常一樣第一次運(yùn)行,但是它設(shè)置了三十(30)秒的超時(shí),并且在每次對(duì)服務(wù)器進(jìn)行Async Ajax調(diào)用之后,回調(diào)都會(huì)再次調(diào)用Ajax。

AJAX調(diào)用可在HTTP協(xié)議上運(yùn)行,這意味著默認(rèn)情況下,對(duì)同一域的請(qǐng)求應(yīng)進(jìn)行多路復(fù)用。我們發(fā)現(xiàn)這種方法存在一些陷阱。

多路復(fù)用(輪詢(xún)響應(yīng)實(shí)際上無(wú)法同步)

輪詢(xún)需要3次往返(TCP SIN,SSL和數(shù)據(jù))

超時(shí)(如果連接保持空閑時(shí)間太長(zhǎng),代理服務(wù)器將關(guān)閉連接)

您可以在這里閱讀更多關(guān)于現(xiàn)實(shí)世界的挑戰(zhàn)。

2.使用WebSockets:

WebSocket只是客戶(hù)端和服務(wù)器之間的持久連接。這是一種通過(guò)單個(gè)TCP連接提供全雙工通信通道的通信協(xié)議。

RFC 6455聲明WebSocket“旨在在HTTP端口80和443上工作,并支持HTTP代理和中介”,從而使其與HTTP協(xié)議兼容。為了實(shí)現(xiàn)兼容性,WebSocket握手使用HTTP升級(jí)標(biāo)頭將HTTP協(xié)議更改為WebSocket協(xié)議。HTTP和WebSocket都位于OSI模型的應(yīng)用程序?qū)?,因此依?lài)于第4層的TCP。

圖片

有一個(gè)MDN文檔詳細(xì)解釋了WebSocket,我也建議您閱讀它。

讓我們看看一個(gè)非常簡(jiǎn)單的WebSocket客戶(hù)端實(shí)現(xiàn)的樣子:

$(function () {

// if user is running mozilla then use it's built-in WebSocket

window.WebSocket = window.WebSocket || window.MozWebSocket;

const connection = new WebSocket('ws://localhost:8080/githubEvents');

connection.onopen = function () {

// connection is opened and ready to use

};

connection.onerror = function (error) {

// an error occurred when sending/receiving data

};

connection.onmessage = function (message) {

// try to decode json (I assume that each message

// from server is json)

try {

const githubEvent = JSON.parse(message.data); // display to the user appropriately

} catch (e) {

console.log('This doesn't look like a valid JSON: '+ message.data);

return;

}

// handle incoming message

};

});

如果服務(wù)器支持WebSocket協(xié)議,它將同意升級(jí),并將通過(guò)響應(yīng)中的Upgrade標(biāo)頭傳達(dá)此信息。

讓我們看看如何在Node.JS(服務(wù)器)中實(shí)現(xiàn):

const express = require('express');

const events = require('./events');

const path = require('path');

const app = express();

const port = process.env.PORT || 5001;

const expressWs = require('express-ws')(app);

app.get('/', function(req, res) {

res.sendFile(path.join(__dirname + '/static/index.html'));

});

app.ws('/', function(ws, req) {

const githubEvent = {}; // sample github Event from Github event API https://api.github.com/events

ws.send('message', githubEvent);

});

app.listen(port, function() {

console.log('Listening on', port);

});

一旦我們從GitHub事件API獲得數(shù)據(jù),就可以在建立連接后將其流式傳輸?shù)娇蛻?hù)端。對(duì)于我們的場(chǎng)景,這種方法也有一些陷阱。

  • 使用WebSockets,我們需要自己處理許多由HTTP處理的問(wèn)題。
  • WebSocket是用于傳輸數(shù)據(jù)的另一種協(xié)議,它不會(huì)通過(guò)HTTP / 2連接自動(dòng)多路復(fù)用。在服務(wù)器和客戶(hù)端上實(shí)現(xiàn)自定義多路復(fù)用有點(diǎn)復(fù)雜。
  • WebSocket是基于幀的,而不是基于流的。當(dāng)我們打開(kāi)網(wǎng)絡(luò)標(biāo)簽。您可以看到WebSocket消息在frame中列出。

圖片

有關(guān)WebSocket的詳細(xì)信息,請(qǐng)查看這篇很棒的文章,在這里您可以閱讀有關(guān)碎片以及如何在后臺(tái)進(jìn)行處理的更多信息。

3.使用SSE:

SSE是一種機(jī)制,一旦建立了客戶(hù)端-服務(wù)器連接,服務(wù)器就可以將數(shù)據(jù)異步推送到客戶(hù)端。然后,只要有新的“大塊”數(shù)據(jù)可用,服務(wù)器就可以決定發(fā)送數(shù)據(jù)??梢詫⑵湟暈閱蜗虬l(fā)布-訂閱模型。

它還提供了一個(gè)標(biāo)準(zhǔn)的JavaScript客戶(hù)端API,稱(chēng)為EventSource,已在大多數(shù)現(xiàn)代瀏覽器中實(shí)現(xiàn),作為W3C的HTML5標(biāo)準(zhǔn)的一部分。 Polyfills可用于不支持EventSource API的瀏覽器。

圖片

我們可以看到Edge和Opera Mini落后于此實(shí)現(xiàn),對(duì)于SSE而言,最重要的案例是針對(duì)移動(dòng)瀏覽器設(shè)備,因?yàn)檫@些瀏覽器沒(méi)有可行的市場(chǎng)份額。Yaffle是事件源的眾所周知的pollyfill。

由于SSE是基于HTTP的,因此它很自然地與HTTP / 2相適應(yīng),并且可以結(jié)合使用以實(shí)現(xiàn)兩者的最佳選擇:HTTP / 2處理基于多路復(fù)用流的有效傳輸層,而SSE為應(yīng)用程序提供API以實(shí)現(xiàn) 推。因此,開(kāi)箱即用地通過(guò)HTTP / 2實(shí)現(xiàn)多路復(fù)用。連接斷開(kāi)時(shí)會(huì)通知客戶(hù)端和服務(wù)器。通過(guò)使用消息維護(hù)唯一的ID,服務(wù)器可以看到客戶(hù)端錯(cuò)過(guò)了n條消息,并在重新連接時(shí)發(fā)送了未完成消息的積壓。

讓我們看看示例客戶(hù)端實(shí)現(xiàn)的外觀:

const evtSource = new EventSource('/events');

evtSource.addEventListener('event', function(evt) {

const data = JSON.parse(evt.data);

// Use data here

},false);

此代碼段非常簡(jiǎn)單。它連接到我們的源并等待接收消息?,F(xiàn)在,示例NodeJS服務(wù)器將如下所示。

// events.js

const EventEmitter = require('eventemitter3');

const emitter = new EventEmitter();

function subscribe(req, res) {

res.writeHead(200, {

'Content-Type': 'text/event-stream',

'Cache-Control': 'no-cache',

Connection: 'keep-alive'

});

// Heartbeat

const nln = function() {

res.write('\\n');

};

const hbt = setInterval(nln, 15000);

const onEvent = function(data) {

res.write('retry: 500\\n');

res.write(event: event\\n);

res.write(data: ${JSON.stringify(data)}\\n\\n);

};

emitter.on('event', onEvent);

// Clear heartbeat and listener

req.on('close', function() {

clearInterval(hbt);

emitter.removeListener('event', onEvent);

});

}

function publish(eventData) {

// Emit events here recieved from Github/Twitter APIs

emitter.emit('event', eventData);

}

module.exports = {

subscribe, // Sending event data to the clients

publish // Emiting events from streaming servers

};

// App.js

const express = require('express');

const events = require('./events');

const port = process.env.PORT || 5001;

const app = express();

app.get('/events', cors(), events.subscribe);

app.listen(port, function() {

console.log('Listening on', port);

});

我們從這種方法中獲得的主要好處是:

  • 實(shí)施更簡(jiǎn)單,數(shù)據(jù)效率更高
  • 開(kāi)箱即用地通過(guò)HTTP / 2自動(dòng)多路復(fù)用
  • 將客戶(hù)端上數(shù)據(jù)的連接數(shù)限制為一個(gè)

如何在SSE,WebSocket和Polling中進(jìn)行選擇?

經(jīng)過(guò)漫長(zhǎng)而詳盡的客戶(hù)端和服務(wù)器實(shí)施之后,SSE似乎是我們解決數(shù)據(jù)交付問(wèn)題的最終答案。也有一些問(wèn)題,但是可以解決。

可以利用服務(wù)器發(fā)送事件的應(yīng)用程序的一些簡(jiǎn)單示例:

  • 實(shí)時(shí)股價(jià)流圖
  • 重要事件的實(shí)時(shí)新聞報(bào)道(發(fā)布鏈接,推文和圖片)
  • 由Twitter的流API提供的實(shí)時(shí)Github / Twitter儀表板墻
  • 監(jiān)視服務(wù)器統(tǒng)計(jì)信息(如正常運(yùn)行時(shí)間,運(yùn)行狀況和正在運(yùn)行的進(jìn)程)的監(jiān)視器。

但是,SSE不僅是其他提供快速更新的方法的可行替代方案。在某些特定情況下,例如在SSE被證明是理想解決方案的情況下,每個(gè)人都可以勝過(guò)其他人??紤]一個(gè)像MMO(大型多人在線)游戲這樣的場(chǎng)景,該場(chǎng)景需要來(lái)自連接兩端的大量消息。在這種情況下,WebSockets將壓制SSE。

如果您的用例需要顯示實(shí)時(shí)的市場(chǎng)新聞,市場(chǎng)數(shù)據(jù),聊天應(yīng)用程序等,例如在我們的案例中,依靠HTTP / 2 + SSE將為您提供有效的雙向通信渠道,同時(shí)又能獲得留在其中的好處HTTP世界。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1286

    瀏覽量

    71145
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9759

    瀏覽量

    87652
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Django3如何使用WebSocket實(shí)現(xiàn)WebShell

    websocket 服務(wù)。 大致看了下覺(jué)得這不夠有趣,翻了翻 django 的官方文檔發(fā)現(xiàn) django 原生是不支持 websocket 的,但 django3 之后支持了 asgi 協(xié)議可以自己實(shí)現(xiàn)
    的頭像 發(fā)表于 11-17 09:58 ?4715次閱讀

    一文詳解WebSocket協(xié)議

    WebSocket出現(xiàn)之前,一個(gè)Web應(yīng)用(即時(shí)聊天、多人協(xié)作)的客戶(hù)端和服務(wù)端之間常見(jiàn)的雙向數(shù)據(jù)交換方式有短輪詢(xún)、長(zhǎng)輪詢(xún)、SSE(Server-Sent Events,服務(wù)器發(fā)送事
    的頭像 發(fā)表于 01-07 11:26 ?8475次閱讀
    一文詳解<b class='flag-5'>WebSocket</b>協(xié)議

    protel與protues哪個(gè)更好些?。?/a>

    `哪位大神能給個(gè)指點(diǎn),protues與protel在EDA方面哪個(gè)更好些?或者在工作崗位上哪個(gè)用的多?。苛餍汹厔?shì)是什么?謝謝了?。?!`
    發(fā)表于 05-03 12:56

    sse指令集

    sse指令集 SSE(Streaming SIMD Extensions,單指令多數(shù)據(jù)流擴(kuò)展)指令集是Intel在Pentium III處理器中率先推出的。其實(shí),早在PIII正式推出之前
    發(fā)表于 12-25 10:59 ?1706次閱讀

    什么是SSE/SIMD/Speculative execut

    什么是SSE/SIMD/Speculative execution? SSE(Streaming SIMD Extensions,單一指令多數(shù)據(jù)流擴(kuò)展) 英特爾開(kāi)發(fā)的第二代SIMD指令集,有70條指令,
    發(fā)表于 02-04 11:14 ?599次閱讀

    什么是Superscalar/SSE/SQRT

    什么是Superscalar/SSE/SQRT   Superscalar: (超標(biāo)量體系結(jié)構(gòu))在同一時(shí)鐘周期可以執(zhí)行多條指令流的處理器架構(gòu)。 SSE: (Streami
    發(fā)表于 02-04 11:27 ?717次閱讀

    什么是WebSocket?進(jìn)行通信解析 WebSocket 報(bào)文及實(shí)現(xiàn)

    一般情況下全為 0。當(dāng)客戶(hù)端、服務(wù)端協(xié)商采用 WebSocket 擴(kuò)展時(shí),這三個(gè)標(biāo)志位可以非0,且值的含義由擴(kuò)展進(jìn)行定義。如果出現(xiàn)非零的值,且并沒(méi)有采用 WebSocket 擴(kuò)展,連接出錯(cuò)。
    的頭像 發(fā)表于 05-15 16:59 ?1w次閱讀
    什么是<b class='flag-5'>WebSocket</b>?進(jìn)行通信解析 <b class='flag-5'>WebSocket</b> 報(bào)文及實(shí)現(xiàn)

    Python如何爬取實(shí)時(shí)變化的WebSocket數(shù)據(jù)

    Python 中的網(wǎng)絡(luò)請(qǐng)求庫(kù)非常多,Requests 是最常用的請(qǐng)求庫(kù)之一,它可以模擬發(fā)送網(wǎng)絡(luò)請(qǐng)求。但是這些請(qǐng)求都是基于 HTTP 協(xié)議的。在面對(duì) WebSocket 的時(shí)候 Requests 就發(fā)揮不料作用了,必須使用能夠連接 WebSocket 的庫(kù)。
    的頭像 發(fā)表于 03-11 09:31 ?3796次閱讀
    Python如何爬取實(shí)時(shí)變化的<b class='flag-5'>WebSocket</b>數(shù)據(jù)

    WebSocket有什么優(yōu)點(diǎn)

    WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,并由RFC7936補(bǔ)充規(guī)范。WebSocket API也被W3C定為標(biāo)準(zhǔn)。HTML5開(kāi)始提
    的頭像 發(fā)表于 02-15 15:53 ?8530次閱讀
    <b class='flag-5'>WebSocket</b>有什么優(yōu)點(diǎn)

    WebSocket工作原理及使用方法

    它有很多名字; WebSocketWebSocket協(xié)議和WebSocket API。從首選的消息傳遞應(yīng)用程序到流行的在線多人游戲,WebSocket在當(dāng)今最常用的Web應(yīng)用程序中是
    的頭像 發(fā)表于 05-05 22:12 ?8240次閱讀
    <b class='flag-5'>WebSocket</b>工作原理及使用方法

    CMOS和CCD哪個(gè)視覺(jué)效果更好

    電子發(fā)燒友網(wǎng)站提供《CMOS和CCD哪個(gè)視覺(jué)效果更好.zip》資料免費(fèi)下載
    發(fā)表于 01-31 09:27 ?0次下載
    CMOS和CCD<b class='flag-5'>哪個(gè)</b>視覺(jué)效果<b class='flag-5'>更好</b>

    鴻蒙上WebSocket的使用方法

    WebSocket 是一種網(wǎng)絡(luò)通訊協(xié)議,很多網(wǎng)絡(luò)開(kāi)發(fā)工作者都需要它。本文介紹在 OpenHarmony 上 WebSocket 協(xié)議的使用方法。
    的頭像 發(fā)表于 03-08 14:17 ?2435次閱讀

    氣動(dòng)執(zhí)行器與電動(dòng)執(zhí)行器:哪個(gè)更好?

    氣動(dòng)執(zhí)行器與電動(dòng)執(zhí)行器:哪個(gè)更好?
    的頭像 發(fā)表于 03-13 16:30 ?7360次閱讀
    氣動(dòng)執(zhí)行器與電動(dòng)執(zhí)行器:<b class='flag-5'>哪個(gè)</b><b class='flag-5'>更好</b>?

    websocket協(xié)議的原理

    WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信——允許服務(wù)器主動(dòng)發(fā)送信息給客戶(hù)端。 WebSocket通信協(xié)議于2011年被IETF
    的頭像 發(fā)表于 11-09 15:13 ?1696次閱讀
    <b class='flag-5'>websocket</b>協(xié)議的原理

    rtthread和freertos哪個(gè)更好 選擇哪個(gè)

    rtthread和freertos哪個(gè)更好 選擇哪個(gè)? RT-Thread和FreeRTOS都是流行的開(kāi)源實(shí)時(shí)操作系統(tǒng)(RTOS),在選擇哪個(gè)更好
    的頭像 發(fā)表于 12-08 10:18 ?1w次閱讀