使用阻塞調用模式將需要:
1. Listening on a socket vector of size N
2. When a message arrives, you wake up with a start in time K, find and start processing the message, employing a time T (it does not matter if the processing is offloaded to another thread: in this case T becomes your offloading time)
3. You finish examining the vector and GOTO 1
所以,你可能會說,如果M郵件到達,並在K + M * T調度時間的另一個消息到達時,M + 1個消息會發現自己在等待K + M * T時間。這是否可以接受你的K(常數),M(交通功能)和T(資源和系統負荷的功能)的期望值?
異步處理,實際上並不存在。總是會有一個「同步」的IO迴路,只有它會很好地集成在內核(甚至是硬件)中,它會比你自己的速度快10-100倍,因此可能會更好地擴展M的值很大。延遲的形式仍然是K1 + M * T1,但是這次K1和T1要低得多。或者,也許K1稍高一些,T1明顯較低:對於大數值的M,架構「可以更好地擴展」。
如果M的值通常很低,那麼異步性的優勢就會比較小。在荒謬的情況下,當您在應用程序生命週期中只有一條消息時,同步或異步使得幾乎沒有區別。
考慮到另一個因素:如果消息的數量變得非常大,異步性有其優勢;但是如果消息本身是獨立的(由消息A引起的變化不影響消息B的處理),那麼你可以保持同步並且水平地縮放,準備數量爲Z的「消息集中器」,每個消息集中器接收分數M/Z的總流量。
如果處理過程需要對其他服務執行其他調用(緩存,持久性,信息檢索,認證...),增加T因子,那麼轉向多線程甚至異步就會更好。使用多線程技術,您可以將T刮至其價值的一小部分(僅限調度時間)。從某種意義上來說,異步處理是一樣的,但是更多的是剃鬚,並且爲您處理更多的編程樣板文件。
我的應用程序確實是高頻交易,是的,我確實需要持久性,但會有一個單獨的進程,將持續的數據,這將使用某種共享內存或IPC共享。 – jaybny 2012-07-22 18:13:06
好的。如果您可以快速地將持久性任務以非阻塞的方式卸載到另一個圖層,那麼您可能會贏。 @ lserni(下圖)的分析非常好。 – Carlos 2012-07-22 20:48:38
仍然試圖弄清楚如何「以非阻塞的方式卸載持久性」..我不能從多線程重播或多播到_localhost_?不會_OS_通過_UDP_併發發送單個流,並且所有這些都是異步執行的?我的操作系統現在是_windows_,但操作系統不重要。 ty – jaybny 2012-08-02 04:26:25