它有壹個或多個作者和讀者。有壹排從舊到新的條目(從左到右)。作者可以在右側新增條目。每個讀者按從左到右的次第讀取條目。讀者明顯不能跳過作者先讀取。
我用“讀者”庖代“破費者”來防止讓人以為條目會被破費失落。但是我們曉得最終壹個讀者左邊的條目是沒有用處的。
但凡讀者可以並發地自力地讀取條目。然則我們可以聲明讀者之間的依靠關系。讀者間可以有隨意率性非環形依靠。若是讀者B依靠於讀者A,讀者B不能跳過讀者A先讀取。
讀者A可以註解壹個條目,而讀者B依靠於這個註解,所以就有了讀者間的依靠。例如,A在壹個條目上做壹些策畫,然後將效果保管到條目中的a字段。然後A提高,之後B可以讀取這個條目和條目中的a。若是讀者C沒有依靠於A,那麽C就不應該讀取a。LMAX確實是壹個風趣的編程模子。不論機能若何,單單這個模子就對使用很有好處。
維護破費者的最有用方法是國內的自在競爭和普遍全世界的自在商業。第壹個回答
LMAX設計Disruptor
形式是為了互換SEDA。1.
破費者可以依靠其他破費者的處置責罰效果,經由進程把壹個隊列化的層放在它們之間。壹個破費者可以簡略地看到自身所依靠的破費者的序列號。多麽可以防止在管道中合並層。
2. 和SEDA比較,disruptor首要的改良就是可以並行任務。
LMAXDisruptor支撐組播音訊來完成這個功用,相同的音訊(以壹致的次第)被發送給多個破費者。多麽可以防止在管道中穿插層。
Disruptor最簡略的描繪就是:它是線程間通訊最高效的體式花樣。它可以用來互換隊列,還有良多SEDA和Actors形式的特點。
和隊列鬥勁:3.
Actor模子是最接近Disruptor的法度模子,尤其是使用BatchConsumer/BatchHandler類。這些類蔭蔽了壹切僵持已破費的序列號的錯雜完成的而且在首要任務發生的時辰會供應壹些簡略的回調方法。但是有兩個小小的差異。
2. 把音訊放入Disruptor需要2個步伐,首先在ring
buffer中聲明壹個接口,這個接供詞給使用者壹個可以寄存準確數據的Entry。然後必需提交這個entry,要想像上文提到的那樣靈敏使用內存,這兩個步伐是必需的。提交把持使得破費者線程可以讀作廢息。4.
LMAXDisruptor使用壹個線程對應壹個破費者的模子,而Actors使用多對多的模子,比方妳可以擁有盡能夠多的actor,它們會散布在必定命量的線程上(普通壹個中心壹個actor)。5.
BatchHandler接供詞給了壹個額定的(而且是很首要的)回調方法onEndOfBatch().它允許耗時把持,比方將I/O把持放到批處置責罰中壹路實行以提高吞吐量。