Neta 是一個幫助用戶輕鬆開發高性能和高可擴展網絡應用程序的網絡應用框架。它提供了一個抽象的異步雙工編程模型,並工作在 Java AIO 之上。
協議棧
無論是單工器還是雙工器它們都是 Handler,多個 Handler 會像多層夾心餅乾一樣疊在一起組成 ProtoStack。 下圖中展示了在單工器和雙工器不同視角下 ProtoStack 的樣貌,雖然看上去有點不同但是它們指代的都是同一個東西。
消息在 ProtoStack 中傳遞遵循如下規則:
上行消息
會被放入 ProtoStack 底部的 RCV_UP 或 Decoder 的 SRC 端點中,事件傳播路徑自底向上,當抵達頂部後會調轉方向重新回到底部。下行消息
會被放入 ProtoStack 頂部的 SND_UP 或 Encoder 的 SRC 端點中,事件傳播路徑自頂向下。- 無論是
上行消息
還是下行消息
最終的終點都是 ProtoStack 的底部輸出節點(SND_DOWN 或 DST)
事件流轉
事件按照狀態分爲:常規、異常兩類,它們通常按照如下方式進行流轉。
- 常規事件:會通過 Handler 的 onMessage 傳播處理。如果 Handler 處理期間發生報錯則會轉換爲異常事件並進入對應的 onError 開啓異常傳播過程。
- 異常事件:會通過 Handler 的 onError 傳播處理。在處理過程中可以通過 ProtoExceptionHolder 的 clear 方法清除異常狀態使其恢復常規事件傳播過程。
流轉控制
流轉控制是指事件在一個方向上傳播過程中,當一個 Handler 執行完畢後決定下一個 Handler 是誰的過程。 通常情況使用的都是順序執行,這就是常見的 Pipeline 結構。
在 Neta 中包含順序在內一共提供了 8 種不同的行爲模式,無論事件的狀態是常規還是異常都可以使用它們。
public ProtoStack onMessage(PipeContext context,
ProtoRcvQueue<ByteBuf> src,
ProtoSndQueue<String> dst) {
...
return ProtoStack.Next; // <--- keep execution sequence
}
下面爲不同流轉控制的行爲方式
Next
- 表示當 Handler 執行後會按照預定的順序執行下一個 Handler。
Retry 行爲
- 重試此方法調用。相當於自身遞歸調用,使用它可以避免遞歸的發生這會讓 JIT 有更多機會來優化代碼。
Again 行爲
- 在當前傳播方向上當事件傳播完畢後,回到這個方向的起點重新開始(如果遇到 Interrupt 那麼將不會重新開始)
- 對於上行消息起點是 ProtoStack 底部的 Handler。
- 對於下行消息起點是 ProtoStack 頂部的 Handler。
Back 行爲
- 在當前傳播方向上當事件傳播完畢後,返回當前節點重新開始(如果遇到 Interrupt 那麼將不會重新開始)
Restart 行爲
- 中斷後續的事件傳播,並回到當前傳播方向的起始位置重新開始。
- 對於上行消息起點是 ProtoStack 底部的 Handler。
- 對於下行消息起點是 ProtoStack 頂部的 Handler。
Skip 行爲
- 繼續執行但是跳過下一個 Handler。
Exit 行爲
- 中斷事件傳播,並跳過所有 Handler直達末尾。
如果在上行事件傳播過程中使用 Exit 行爲,那麼在進入下行處理的時候會從 Exit 處開始向下傳播而非 ProtoStack 的頂部。
對於上行消息 Exit 意味着,結束上行傳播階段進入下行傳播階段。而下行傳播階段會從 Exit 位置開始。
Interrupt 行爲
- 中斷管道事件傳播並拋出錯誤。
結尾
- 項目地址:https://gitee.com/zycgit/neta
- 在 https://gitee.com/zycgit/neta/issues 遞交反饋問題(建議在這裏先記錄問題方便跟蹤)
文章列表