分享一個Linux C++訊息通訊框架TCPSHM
由於本人從事行業關係,Linux環境下的低延遲通訊是我關注的技術之一。要達到極端的低延遲,當然同機器內IPC比網路通訊快,而Linux IPC方式中無疑是共享記憶體延遲最低。不過相對於TCP這種通用的通訊方式來說,共享記憶體缺少了一些控制層的協議,比如程序A和B通過一個基於共享記憶體的訊息佇列通訊,A很難知道佇列另一端的B是否存在,具體的說就是基於共享記憶體的簡單訊息佇列缺少了連線建立和斷開的控制。
另一方面,相對於SHM(共享記憶體)來說,使用TCP也有些自己的痛點:除了延遲以外,重連恢復是個所有應用場景下都不可避免的問題。我們知道,由於網路問題或程序崩潰,TCP連線斷開是很常見的事情,斷開前傳送方發出的資料可能沒有被接收,也可能接收了還沒被處理接收方就掛了,所以為了確保不丟失資訊,傳送方的應用程式需要儲存已傳送的資訊,即使自己並不需要,等收到對方的確認訊息才能丟棄。也就是說,一個真正可靠的TCP應用程式需要做很多無關業務的控制層的事情。而這個問題SHM並不存在,只要機器不掉電,程式的崩潰與重啟對於SHM是透明的,也就是說崩潰前已寫入且未讀取的資料還會在那裡,程式重啟後不需做任何資料重傳之類的事情。
於是我想,如果TCP和SHM分別彌補了上述各自的缺點,那麼它們使用起來將會及其相似:就像一個帶連線屬性的持久化訊息佇列,使用者可以像操作一個普通訊息佇列一樣push和pop訊息,對於傳送方來說已經push的訊息不需要自己儲存副本,對於接受方來說沒有pop的訊息不會丟失,同時雙方都能知道對方是否還活著。這樣一個抽象的訊息佇列可以基於TCP,以支援遠端通訊,也可以基於SHM, 以提供超低延遲,這對於使用者來說可以完全透明。
TCPSHM就是這樣一個解決方案。TCPSHM是一個Linux下的輕量級高效能的C++模板類庫開源專案,提供了客戶端和服務端的框架,同時高度可配置和可定製。歡迎感興趣的同學瞭解一下,並提出寶貴的意見,謝謝~