我正在嘗試設計一個 SwiftNIO 服務器,其中多個客戶端(如 2 個或 3 個)可以連接到服務器,并且在連接時,它們都可以從服務器接收資訊。
為此,我創建了一個ServerHandler類,該類被共享并添加到連接客戶端的每個管道中。
let group = MultiThreadedEventLoopGroup(numberOfThreads: 2)
let handler = ServerHandler()
let bootstrap = ServerBootstrap(group: group)
.serverChannelOption(ChannelOptions.backlog, value: 2)
.serverChannelOption(ChannelOptions.socketOption(.so_reuseaddr), value: 1)
.childChannelInitializer { $0.pipeline.addHandler(handler) }
.childChannelOption(ChannelOptions.socketOption(.so_reuseaddr), value: 1)
上面的代碼靈感來自https://github.com/apple/swift-nio/blob/main/Sources/NIOChatServer/main.swift
在ServerHandler類中,每當有新客戶端連接時,該通道都會添加到陣列中。然后,當我準備好向所有客戶端發送資料時,我只需遍歷 中的通道ServerHandler,然后呼叫writeAndFlush.
這似乎作業得很好,但我擔心以下幾點:
- 似乎并不真正推薦創建共享處理程式,您應該為每個客戶端創建一個新處理程式。但是,我將如何訪問需要向其發送資料的所有客戶端通道?(我在用戶界面確定的時間發送資料)
- 為什么
Channel.write好像什么都不做?如果我使用Channel.write而不是writeAndFlush在服務器中使用,我的客戶端將無法接收任何資料。
如果這些問題很愚蠢,我深表歉意,我SwiftNIO最近才剛剛開始和一般的網路。
如果有人能給我一些見解,那就太棒了。
uj5u.com熱心網友回復:
你的問題一點都不傻!
是的,共享一個
ChannelHandler可能算作“不推薦”。但不是因為它不起作用,而是因為它不尋常,可能不是其他 NIO 程式員所期望的。但是,如果您對此感到滿意,那就沒問題了。如果您的性能足夠高,以至于擔心每個分配的確切數量,Channel那么您可以通過共享處理程式來節省一些。但我真的不會過早地優化。如果您不想共享處理程式,那么您可以使用多個處理程式來共享對某種協調器物件的參考。不要誤會我的意思,它實際上仍然是同一件事:跨多個網路連接的一個共享參考。唯一真正的區別是測驗可能更容易一些,并且其他 NIO 程式員可能會感覺更自然。(在任何情況下,都要小心確保所有這些
Channels 都在相同的位置EventLoop或使用外部同步(比如鎖,從性能的角度來看這可能不是理想的)。write只是排隊一些要寫入的資料。flush使 SwiftNIO 嘗試發送所有先前寫入的資料。writeAndFlush只需呼叫write然后flush。蔚來為什么要區分
write和根本不區分flush?在高性能網路應用程式中,最大的開銷可能是系統呼叫開銷。為了通過 TCP 發送資料,SwiftNIO 必須執行一個系統呼叫 (write,writev,send, ...)。任何SwiftNIO程式會作業,如果你不理會
write,并flush和總是使用writeAndFlush。但是,如果網路跟上,每次writeAndFlush呼叫將花費您一個系統呼叫。然而,在許多情況下,使用 SwiftNIO 的庫/應用程式已經知道它想要將要通過網路發送的多位資料加入佇列。在這種情況下writeAndFlush,連續說三個是浪費。如果累積這三位資料然后使用“向量寫入”(例如writev系統呼叫)在一個系統呼叫中將它們全部發送會更好。如果你確實說write,write,write, ,這正是 SwiftNIO 會做的flush。所以三個寫入都將使用一個發送writev系統呼叫。SwiftNIO 將簡單地獲取指向資料位的三個指標并將它們交給內核,然后內核嘗試通過網路發送它們。你可以更進一步。假設您是一個高性能服務器,并且想要回應大量傳入請求。您將從客戶那里收到您的請求
channelRead。如果您現在能夠同步回復,您可以只回復write他們(這將使他們入隊)。一旦你得到channelReadComplete(這標志著“讀突發”的結束),你就可以flush. 這將允許您僅使用一個writev系統呼叫在一次讀取突發中回應盡可能多的請求。在某些情況下,這可能是一項非常重要的優化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/386651.html
