在ChatGPT官網(wǎng)我們可以看到,對(duì)話的方式僅僅只有一個(gè)post
請(qǐng)求,而沒(méi)有使用IM
中使用的websocket
鏈接。
同時(shí)我們可以看到與普通的post
請(qǐng)求不一樣的是,返回信息Response
沒(méi)有了,取而代之的是EventStream
。
那么這個(gè)EventStream
是什么東西?
一通查證后,發(fā)現(xiàn)這個(gè)是Web API中的EventSource
接口返回的數(shù)據(jù)。
MDN的官方描述是這樣的(傳送門(mén)):
EventSource
接口是 web 內(nèi)容與服務(wù)器發(fā)送事件
一個(gè) EventSource
實(shí)例會(huì)對(duì)HTTP服務(wù)器開(kāi)啟一個(gè)持久化的連接,以 text/event-stream
格式發(fā)送事件,此連接會(huì)一直保持開(kāi)啟直到通過(guò)調(diào)用 EventSource.close()
關(guān)閉。
好家伙,還有這好東西。是我以前孤陋寡聞了。
經(jīng)過(guò)一番對(duì)比,總結(jié)了一下 EventSource
和 Websocket
的區(qū)別和優(yōu)劣:
EventSource:
簡(jiǎn)單易用:EventSource API非常簡(jiǎn)單,易于使用和理解。
服務(wù)器推送:EventSource適用于服務(wù)器主動(dòng)向客戶端推送數(shù)據(jù),客戶端只能接收服務(wù)器發(fā)送的事件。
自動(dòng)重連:EventSource會(huì)自動(dòng)處理連接斷開(kāi)和重新連接的情況,適用于長(zhǎng)期保持連接并接收事件流的場(chǎng)景。
兼容性:EventSource在大多數(shù)現(xiàn)代瀏覽器中得到支持。
WebSocket:
雙向通信:WebSocket支持雙向通信,客戶端和服務(wù)器可以彼此發(fā)送數(shù)據(jù)。
實(shí)時(shí)性:WebSocket提供了更低的延遲和更快的數(shù)據(jù)傳輸速度,適用于實(shí)時(shí)性要求較高的應(yīng)用場(chǎng)景。
豐富的功能:WebSocket提供了更多的功能,例如數(shù)據(jù)幀的自定義和二進(jìn)制數(shù)據(jù)的傳輸?shù)取?/p>
復(fù)雜性:WebSocket API相對(duì)于EventSource更為復(fù)雜,使用起來(lái)可能需要更多的代碼和理解。
需要服務(wù)器支持:使用WebSocket需要服務(wù)器端實(shí)現(xiàn)對(duì)應(yīng)的WebSocket協(xié)議,而EventSource只需要服務(wù)器端支持發(fā)送事件即可。
兼容性:相對(duì)于EventSource,WebSocket在某些較舊的瀏覽器或網(wǎng)絡(luò)環(huán)境中的支持可能不夠廣泛。
綜上所述,EventSource
適用于服務(wù)器主動(dòng)推送事件給客戶端,并且在保持長(zhǎng)期連接和接收事件流時(shí)表現(xiàn)良好。 WebSocket
適用于需要實(shí)時(shí)雙向通信和更豐富功能的場(chǎng)景,但需要服務(wù)器端和客戶端都支持 WebSocket
協(xié)議,選擇使用哪種技術(shù)應(yīng)基于具體需求和應(yīng)用場(chǎng)景進(jìn)行評(píng)估。
那么有了上面的結(jié)論我們?cè)賮?lái)看看,為什么 ChatGPT
對(duì)話為什么不用 Websocket
而使用 EventSource
?
當(dāng)然,ChatGPT
對(duì)話可以使用Websocket
或EventSource
進(jìn)行實(shí)時(shí)通信,下面是我個(gè)人的總結(jié):
服務(wù)器推送:EventSource
專(zhuān)注于服務(wù)器向客戶端主動(dòng)推送事件的模型,這對(duì)于ChatGPT
對(duì)話非常適用。ChatGPT
通常是作為一個(gè)長(zhǎng)期運(yùn)行的服務(wù),當(dāng)有新的回復(fù)可用時(shí),服務(wù)器可以主動(dòng)推送給客戶端,而不需要客戶端頻繁發(fā)送請(qǐng)求。
自動(dòng)重連和錯(cuò)誤處理:EventSource
具有內(nèi)置的自動(dòng)重連機(jī)制,它會(huì)自動(dòng)處理連接斷開(kāi)和重新連接的情況。這對(duì)于ChatGPT
對(duì)話而言很重要,因?yàn)閷?duì)話可能需要持續(xù)一段時(shí)間,連接的穩(wěn)定性很重要。
簡(jiǎn)單性和易用性:相對(duì)于WebSocket
,EventSource
的API更加簡(jiǎn)單易用,只需實(shí)例化一個(gè)EventSource
對(duì)象,并處理服務(wù)器發(fā)送的事件即可。這使得開(kāi)發(fā)者可以更快速地實(shí)現(xiàn)對(duì)話功能,減少了一些復(fù)雜性。
廣泛的瀏覽器支持:EventSource
在大多數(shù)現(xiàn)代瀏覽器中得到廣泛支持,包括移動(dòng)端瀏覽器。相比之下,WebSocket
在某些舊版本的瀏覽器中可能不被完全支持,需要考慮兼容性問(wèn)題。
需要注意的是,WebSocket
也是一種很好的選擇,特別是當(dāng)需要實(shí)現(xiàn)更復(fù)雜的實(shí)時(shí)雙向通信、自定義協(xié)議等功能時(shí),或者對(duì)瀏覽器的兼容性要求較高時(shí)。最終選擇使用WebSocket
還是EventSource
應(yīng)該根據(jù)具體的項(xiàng)目需求和技術(shù)考慮來(lái)確定。